ZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOGRjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTCkBAIC0wLDAgKzEsMTQ3IEBACisKK0ZvciBhIGNvbXBsZXRlIE1lcmN1cmlhbCBjaGFuZ2Vsb2csIHNlZQorJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy94aS9weXlhbWwvY29tbWl0cycuCisKKzMuMTEgKDIwMTQtMDMtMjYpCistLS0tLS0tLS0tLS0tLS0tLQorCisqIFNvdXJjZSBhbmQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMgYXJlIHJlYnVpbHQgYWdhaW5zdCB0aGUgbGF0ZXN0CisgIHZlcnNpb25zIG9mIEN5dGhvbiBhbmQgTGliWUFNTC4KKworMy4xMCAoMjAxMS0wNS0zMCkKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogRG8gbm90IHRyeSB0byBidWlsZCBMaWJZQU1MIGJpbmRpbmdzIG9uIHBsYXRmb3JtcyBvdGhlciB0aGFuIENQeXRob24KKyAgKFRoYW5rIHRvIG9sdChhdClib2dvc29mdChkb3QpY29tKS4KKyogQ2xlYXIgY3ljbGljIHJlZmVyZW5jZXMgaW4gdGhlIHBhcnNlciBhbmQgdGhlIGVtaXR0ZXIKKyAgKFRoYW5rIHRvIGtyaXN0amFuKGF0KWNjcGdhbWVzKGRvdCljb20pLgorKiBEcm9wcGVkIHN1cHBvcnQgZm9yIFB5dGhvbiAyLjMgYW5kIDIuNC4KKworMy4wOSAoMjAwOS0wOC0zMSkKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4ZWQgYW4gb2JzY3VyZSBzY2FubmVyIGVycm9yIG5vdCByZXBvcnRlZCB3aGVuIHRoZXJlIGlzCisgIG5vIGxpbmUgYnJlYWsgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChUaGFuayB0byBJbmd5KS4KKyogRml4ZWQgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdoZW4gZW1pdHRpbmcgYW5jaG9ycyB3aXRoCisgIExpYllBTUwgYmluZGluZ3MgKFRoYW5rIHRvIGNlZ25lcihhdCl5YWhvby1pbmMoZG90KWNvbSkuCisqIEZpeGVkIGVtaXR0aW5nIGluY29ycmVjdCBCT00gY2hhcmFjdGVycyBmb3IgVVRGLTE2IChUaGFuayB0bworICBWYWxlbnRpbiBOZWNoYXlldikKKyogRml4ZWQgdGhlIGVtaXR0ZXIgZm9yIGZvbGRlZCBzY2FsYXJzIG5vdCByZXNwZWN0aW5nIHRoZSBwcmVmZXJyZWQKKyAgbGluZSB3aWR0aCAoVGhhbmsgdG8gSW5neSkuCisqIEZpeGVkIGEgc3VidGxlIG9yZGVyaW5nIGlzc3VlIHdpdGggZW1pdHRpbmcgJyVUQUcnIGRpcmVjdGl2ZXMKKyAgKFRoYW5rIHRvIEFuZHJleSBTb21vdikuCisqIEZpeGVkIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gd2l0aCBMaWJZQU1MIGJpbmRpbmdzLgorCisKKzMuMDggKDIwMDgtMTItMzEpCistLS0tLS0tLS0tLS0tLS0tLQorCisqIFB5dGhvbiAzIHN1cHBvcnQgKFRoYW5rIHRvIEVyaWNrIFRyeXplbGFhcikuCisqIFVzZSBDeXRob24gaW5zdGVhZCBvZiBQeXJleCB0byBidWlsZCBMaWJZQU1MIGJpbmRpbmdzLgorKiBSZWZhY3RvcmVkIHN1cHBvcnQgZm9yIHVuaWNvZGUgYW5kIGJ5dGUgaW5wdXQvb3V0cHV0IHN0cmVhbXMuCisKKworMy4wNyAoMjAwOC0xMi0yOSkKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIGVtaXR0ZXIgbGVhcm5lZCB0byB1c2UgYW4gb3B0aW9uYWwgaW5kZW50YXRpb24gaW5kaWNhdG9yCisgIGZvciBibG9jayBzY2FsYXI7IHRodXMgc2NhbGFycyB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZXMKKyAgY291bGQgbm93IGJlIHJlcHJlc2VudGVkIGluIGEgbGl0ZXJhbCBvciBmb2xkZWQgc3R5bGUuCisqIFRoZSB0ZXN0IHN1aXRlIGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAgVG8gcnVuIHRoZSB0ZXN0cywgdHlwZSAncHl0aG9uIHNldHVwLnB5IHRlc3QnLgorKiBSZWZhY3RvcmVkIHRoZSB0ZXN0IHN1aXRlOiBkcm9wcGVkIHVuaXR0ZXN0IGluIGZhdm9yIG9mCisgIGEgY3VzdG9tIHRlc3QgYXBwbGlhbmNlLgorKiBGaXhlZCB0aGUgcGF0aCByZXNvbHZlciBpbiBDRHVtcGVyLgorKiBGb3JjZWQgYW4gZXhwbGljaXQgZG9jdW1lbnQgZW5kIGluZGljYXRvciB3aGVuIHRoZXJlIGlzCisgIGEgcG9zc2liaWxpdHkgb2YgcGFyc2luZyBhbWJpZ3VpdHkuCisqIE1vcmUgc2V0dXAucHkgaW1wcm92ZW1lbnRzOiB0aGUgcGFja2FnZSBzaG91bGQgYmUgdXNhYmxlCisgIHdoZW4gYW55IGNvbWJpbmF0aW9uIG9mIHNldHVwdG9vbHMsIFB5cmV4IGFuZCBMaWJZQU1MCisgIGlzIGluc3RhbGxlZC4KKyogV2luZG93cyBiaW5hcnkgcGFja2FnZXMgYXJlIGJ1aWx0IGFnYWluc3QgTGliWUFNTC0wLjEuMi4KKyogTWlub3IgdHlwb3MgYW5kIGNvcnJlY3Rpb25zIChUaGFuayB0byBJbmd5IGRvdCBOZXQKKyAgYW5kIEFuZHJleSBTb21vdikuCisKKworMy4wNiAoMjAwOC0xMC0wMykKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogc2V0dXAucHkgY2hlY2tzIHdoZXRoZXIgTGliWUFNTCBpcyBpbnN0YWxsZWQgYW5kIGlmIHNvLCBidWlsZHMKKyAgYW5kIGluc3RhbGxzIExpYllBTUwgYmluZGluZ3MuICBUbyBmb3JjZSBvciBkaXNhYmxlIGluc3RhbGxhdGlvbgorICBvZiBMaWJZQU1MIGJpbmRpbmdzLCB1c2UgJy0td2l0aC1saWJ5YW1sJyBvciAnLS13aXRob3V0LWxpYnlhbWwnCisgIHJlc3BlY3RpdmVseS4KKyogVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaW5jbHVkZXMgY29tcGlsZWQgUHlyZXggc291cmNlcyBzbworICBidWlsZGluZyBMaWJZQU1MIGJpbmRpbmdzIG5vIGxvbmdlciByZXF1aXJlcyBQeXJleCBpbnN0YWxsZWQuCisqICd5YW1sLmxvYWQoKScgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5zCisgIG1vcmUgdGhhbiBvbmUgWUFNTCBkb2N1bWVudC4KKyogRml4ZWQgZXhjZXB0aW9ucyBwcm9kdWNlZCBieSBMaWJZQU1MIGJpbmRpbmdzLgorKiBGaXhlZCBhIGRvdCAnLicgY2hhcmFjdGVyIGJlaW5nIHJlY29nbml6ZWQgYXMgISFmbG9hdC4KKyogRml4ZWQgUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5IGlzc3VlIGluIGNvbnN0cnVjdGluZyAhIXRpbWVzdGFtcCB2YWx1ZXMuCisqIFdpbmRvd3MgYmluYXJ5IHBhY2thZ2VzIGFyZSBidWlsdCBhZ2FpbnN0IHRoZSBMaWJZQU1MIHN0YWJsZSBicmFuY2guCisqIEFkZGVkIGF0dHJpYnV0ZXMgJ3lhbWwuX192ZXJzaW9uX18nIGFuZCAgJ3lhbWwuX193aXRoX2xpYnlhbWxfXycuCisKKworMy4wNSAoMjAwNy0wNS0xMykKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogV2luZG93cyBiaW5hcnkgcGFja2FnZXMgd2VyZSBidWlsdCB3aXRoIExpYllBTUwgdHJ1bmsuCisqIEZpeGVkIGEgYnVnIHRoYXQgcHJldmVudCBwcm9jZXNzaW5nIGEgbGl2ZSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMgaW4KKyAgdGltZWx5IG1hbm5lciAoVGhhbmtzIGVkd2FyZChhdClzd2VldGJ5dGVzKGRvdCluZXQpLgorKiBGaXhlZCBhIGJ1ZyB3aGVuIHRoZSBwYXRoIGluIGFkZF9wYXRoX3Jlc29sdmVyIGNvbnRhaW5zIGJvb2xlYW4gdmFsdWVzCisgIChUaGFua3MganN0cm91ZChhdCltYmkoZG90KXVjbGEoZG90KWVkdSkuCisqIEZpeGVkIGxvc3Mgb2YgbWljcm9zZWNvbmQgcHJlY2lzaW9uIGluIHRpbWVzdGFtcHMKKyAgKFRoYW5rcyBlZGVtYWluZShhdCltaXQoZG90KWVkdSkuCisqIEZpeGVkIGxvYWRpbmcgYW4gZW1wdHkgWUFNTCBzdHJlYW0uCisqIEFsbG93ZWQgaW1tdXRhYmxlIHN1YmNsYXNzZXMgb2YgWUFNTE9iamVjdC4KKyogTWFkZSB0aGUgZW5jb2Rpbmcgb2YgdGhlIHVuaWNvZGUtPnN0ciBjb252ZXJzaW9uIGV4cGxpY2l0IHNvIHRoYXQKKyAgdGhlIGNvbnZlcnNpb24gZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBkZWZhdWx0IFB5dGhvbiBlbmNvZGluZy4KKyogRm9yY2VkIGVtaXR0aW5nIGZsb2F0IHZhbHVlcyBpbiBhIFlBTUwgY29tcGF0aWJsZSBmb3JtLgorCisKKzMuMDQgKDIwMDYtMDgtMjApCistLS0tLS0tLS0tLS0tLS0tLQorCisqIEluY2x1ZGUgZXhwZXJpbWVudGFsIExpYllBTUwgYmluZGluZ3MuCisqIEZ1bGx5IHN1cHBvcnQgcmVjdXJzaXZlIHN0cnVjdHVyZXMuCisqIFNvcnQgZGljdGlvbmFyeSBrZXlzLiAgTWFwcGluZyBub2RlIHZhbHVlcyBhcmUgbm93IHJlcHJlc2VudGVkCisgIGFzIGxpc3RzIG9mIHBhaXJzIGluc3RlYWQgb2YgZGljdGlvbmFyaWVzLiAgTm8gbG9uZ2VyIGNoZWNrCisgIGZvciBkdXBsaWNhdGUgbWFwcGluZyBrZXlzIGFzIGl0IGRpZG4ndCB3b3JrIGNvcnJlY3RseSBhbnl3YXkuCisqIEZpeCBpbnZhbGlkIG91dHB1dCBvZiBzaW5nbGUtcXVvdGVkIHNjYWxhcnMgaW4gY2FzZXMgd2hlbiBhIHNpbmdsZQorICBxdW90ZSBpcyBub3QgZXNjYXBlZCB3aGVuIHByZWNlZWRlZCBieSB3aGl0ZXNwYWNlcyBvciBsaW5lIGJyZWFrcy4KKyogVG8gbWFrZSBwb3J0aW5nIGVhc2llciwgcmV3cml0ZSBQYXJzZXIgbm90IHVzaW5nIGdlbmVyYXRvcnMuCisqIEZpeCBoYW5kbGluZyBvZiB1bmV4cGVjdGVkIGJsb2NrIG1hcHBpbmcgdmFsdWVzLgorKiBGaXggYSBidWcgaW4gUmVwcmVzZW50ZXIucmVwcmVzZW50X29iamVjdDogY29weV9yZWcuZGlzcGF0Y2hfdGFibGUKKyAgd2FzIG5vdCBjb3JyZWN0bHkgaGFuZGxlZC4KKyogRml4IGEgYnVnIHdoZW4gYSBibG9jayBzY2FsYXIgaXMgaW5jb3JyZWN0bHkgZW1pdHRlZCBpbiB0aGUgc2ltcGxlCisgIGtleSBjb250ZXh0LgorKiBIb2xkIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdHMgYmVpbmcgcmVwcmVzZW50ZWQuCisqIE1ha2UgUmVwcmVzZW50ZXIgbm90IHRyeSB0byBndWVzcyAhIXBhaXJzIHdoZW4gYSBsaXN0IGlzIHJlcHJlc2VudGVkLgorKiBGaXggdGltZXN0YW1wIGNvbnN0cnVjdGluZyBhbmQgcmVwcmVzZW50aW5nLgorKiBGaXggdGhlICdOJyBwbGFpbiBzY2FsYXIgYmVpbmcgaW5jb3JyZWN0bHkgcmVjb2duaXplZCBhcyAhIWJvb2wuCisKKworMy4wMyAoMjAwNi0wNi0xOSkKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4IFB5dGhvbiAyLjUgY29tcGF0aWJpbGl0eSBpc3N1ZXMuCisqIEZpeCBudW1lcm91cyBidWdzIGluIHRoZSBmbG9hdCBoYW5kbGluZy4KKyogRml4IHNjYW5uaW5nIHNvbWUgaWxsLWZvcm1lZCBkb2N1bWVudHMuCisqIE90aGVyIG1pbm9yIGZpeGVzLgorCisKKzMuMDIgKDIwMDYtMDUtMTUpCistLS0tLS0tLS0tLS0tLS0tLQorCisqIEZpeCB3aW4zMiBpbnN0YWxsZXIuICBBcHBhcmVudGx5IGJkaXN0X3dpbmluc3QgZG9lcyBub3Qgd29yayB3ZWxsCisgIHVuZGVyIExpbnV4LgorKiBGaXggYSBidWcgaW4gYWRkX3BhdGhfcmVzb2x2ZXIuCisqIEFkZCB0aGUgeWFtbC1oaWdobGlnaHQgZXhhbXBsZS4gIFRyeSB0byBydW4gb24gYSBjb2xvciB0ZXJtaW5hbDoKKyAgYHB5dGhvbiB5YW1sX2hsLnB5IDxhbnlfZG9jdW1lbnQueWFtbGAuCisKKworMy4wMSAoMjAwNi0wNS0wNykKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogSW5pdGlhbCByZWxlYXNlLiAgVGhlIHZlcnNpb24gbnVtYmVyIHJlZmxlY3RzIHRoZSBjb2RlbmFtZQorICBvZiB0aGUgcHJvamVjdCAoUHlZQU1MIDMwMDApIGFuZCBkaWZmZXJlbmNpYXRlcyBpdCBmcm9tCisgIHRoZSBhYmFuZG9uZWQgUHlZYW1sIG1vZHVsZS4gCisKZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGNlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsMTkgQEAKK0NvcHlyaWdodCAoYykgMjAwNiBLaXJpbGwgU2ltb25vdgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKK2NvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCitTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL01BTklGRVNULmluIGIvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZTc4MAotLS0gL2Rldi9udWxsCisrKyBiL01BTklGRVNULmluCkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZSBSRUFETUUgTElDRU5TRSBDSEFOR0VTIHNldHVwLnB5CityZWN1cnNpdmUtaW5jbHVkZSBsaWIveWFtbCAqLnB5CityZWN1cnNpdmUtaW5jbHVkZSBsaWIzL3lhbWwgKi5weQorcmVjdXJzaXZlLWluY2x1ZGUgZXhhbXBsZXMgKi5weSAqLmNmZyAqLnlhbWwKK3JlY3Vyc2l2ZS1pbmNsdWRlIHRlc3RzL2RhdGEgKgorcmVjdXJzaXZlLWluY2x1ZGUgdGVzdHMvbGliICoucHkKK3JlY3Vyc2l2ZS1pbmNsdWRlIHRlc3RzL2xpYjMgKi5weQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI0OWUzCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorCisuUEhPTlk6IGRlZmF1bHQgYnVpbGQgYnVpbGRleHQgZm9yY2UgZm9yY2VleHQgaW5zdGFsbCBpbnN0YWxsZXh0IHRlc3QgdGVzdGV4dCBkaXN0IGNsZWFuCisKK1BZVEhPTj0vdXNyL2Jpbi9weXRob24KK1RFU1Q9CitQQVJBTUVURVJTPQorCitidWlsZDoKKwkke1BZVEhPTn0gc2V0dXAucHkgYnVpbGQgJHtQQVJBTUVURVJTfQorCitidWlsZGV4dDoKKwkke1BZVEhPTn0gc2V0dXAucHkgLS13aXRoLWxpYnlhbWwgYnVpbGQgJHtQQVJBTUVURVJTfQorCitmb3JjZToKKwkke1BZVEhPTn0gc2V0dXAucHkgYnVpbGQgLWYgJHtQQVJBTUVURVJTfQorCitmb3JjZWV4dDoKKwkke1BZVEhPTn0gc2V0dXAucHkgLS13aXRoLWxpYnlhbWwgYnVpbGQgLWYgJHtQQVJBTUVURVJTfQorCitpbnN0YWxsOgorCSR7UFlUSE9OfSBzZXR1cC5weSBpbnN0YWxsICR7UEFSQU1FVEVSU30KKworaW5zdGFsbGV4dDoKKwkke1BZVEhPTn0gc2V0dXAucHkgLS13aXRoLWxpYnlhbWwgaW5zdGFsbCAke1BBUkFNRVRFUlN9CisKK3Rlc3Q6IGJ1aWxkCisJJHtQWVRIT059IHRlc3RzL2xpYi90ZXN0X2J1aWxkLnB5ICR7VEVTVH0KKwordGVzdGV4dDogYnVpbGRleHQKKwkke1BZVEhPTn0gdGVzdHMvbGliL3Rlc3RfYnVpbGRfZXh0LnB5ICR7VEVTVH0KKwordGVzdGFsbDoKKwkke1BZVEhPTn0gc2V0dXAucHkgdGVzdAorCitkaXN0OgorCSR7UFlUSE9OfSBzZXR1cC5weSAtLXdpdGgtbGlieWFtbCBzZGlzdCAtLWZvcm1hdHM9emlwLGd6dGFyCisKK3dpbmRpc3Q6CisJJHtQWVRIT059IHNldHVwLnB5IC0td2l0aC1saWJ5YW1sIGJkaXN0X3dpbmluc3QKKworY2xlYW46CisJJHtQWVRIT059IHNldHVwLnB5IC0td2l0aC1saWJ5YW1sIGNsZWFuIC1hCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZGYxMwotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDM1IEBACitQeVlBTUwgLSBUaGUgbmV4dCBnZW5lcmF0aW9uIFlBTUwgcGFyc2VyIGFuZCBlbWl0dGVyIGZvciBQeXRob24uCisKK1RvIGluc3RhbGwsIHR5cGUgJ3B5dGhvbiBzZXR1cC5weSBpbnN0YWxsJy4KKworQnkgZGVmYXVsdCwgdGhlIHNldHVwLnB5IHNjcmlwdCBjaGVja3Mgd2hldGhlciBMaWJZQU1MIGlzIGluc3RhbGxlZAorYW5kIGlmIHNvLCBidWlsZHMgYW5kIGluc3RhbGxzIExpYllBTUwgYmluZGluZ3MuICBUbyBza2lwIHRoZSBjaGVjaworYW5kIGZvcmNlIGluc3RhbGxhdGlvbiBvZiBMaWJZQU1MIGJpbmRpbmdzLCB1c2UgdGhlIG9wdGlvbiAnLS13aXRoLWxpYnlhbWwnOgorJ3B5dGhvbiBzZXR1cC5weSAtLXdpdGgtbGlieWFtbCBpbnN0YWxsJy4gIFRvIGRpc2FibGUgdGhlIGNoZWNrIGFuZAorc2tpcCBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBMaWJZQU1MIGJpbmRpbmdzLCB1c2UgJy0td2l0aG91dC1saWJ5YW1sJzoKKydweXRob24gc2V0dXAucHkgLS13aXRob3V0LWxpYnlhbWwgaW5zdGFsbCcuCisKK1doZW4gTGliWUFNTCBiaW5kaW5ncyBhcmUgaW5zdGFsbGVkLCB5b3UgbWF5IHVzZSBmYXN0IExpYllBTUwtYmFzZWQKK3BhcnNlciBhbmQgZW1pdHRlciBhcyBmb2xsb3dzOgorCisgICAgPj4+IHlhbWwubG9hZChzdHJlYW0sIExvYWRlcj15YW1sLkNMb2FkZXIpCisgICAgPj4+IHlhbWwuZHVtcChkYXRhLCBEdW1wZXI9eWFtbC5DRHVtcGVyKQorCitQeVlBTUwgaW5jbHVkZXMgYSBjb21wcmVoZW5zaXZlIHRlc3Qgc3VpdGUuICBUbyBydW4gdGhlIHRlc3RzLAordHlwZSAncHl0aG9uIHNldHVwLnB5IHRlc3QnLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgdGhlIFB5WUFNTCBob21lcGFnZToKKydodHRwOi8vcHl5YW1sLm9yZy93aWtpL1B5WUFNTCcuCisKK0ZvciBQeVlBTUwgdHV0b3JpYWwgYW5kIHJlZmVyZW5jZSwgc2VlOgorJ2h0dHA6Ly9weXlhbWwub3JnL3dpa2kvUHlZQU1MRG9jdW1lbnRhdGlvbicuCisKK1Bvc3QgeW91ciBxdWVzdGlvbnMgYW5kIG9waW5pb25zIHRvIHRoZSBZQU1MLUNvcmUgbWFpbGluZyBsaXN0OgorJ2h0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8veWFtbC1jb3JlJy4KKworU3VibWl0IGJ1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIHRvIHRoZSBQeVlBTUwgYnVnIHRyYWNrZXI6CisnaHR0cDovL3B5eWFtbC5vcmcvbmV3dGlja2V0P2NvbXBvbmVudD1weXlhbWwnLgorCitQeVlBTUwgaXMgd3JpdHRlbiBieSBLaXJpbGwgU2ltb25vdiA8eGlAcmVzb2x2ZW50Lm5ldD4uICBJdCBpcyByZWxlYXNlZAordW5kZXIgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgorCmRpZmYgLS1naXQgYS9hbm5vdW5jZW1lbnQubXNnIGIvYW5ub3VuY2VtZW50Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZmNzJlCi0tLSAvZGV2L251bGwKKysrIGIvYW5ub3VuY2VtZW50Lm1zZwpAQCAtMCwwICsxLDkyIEBACitGcm9tOiBLaXJpbGwgU2ltb25vdiA8eGlAcmVzb2x2ZW50Lm5ldD4KK1RvOiBweXRob24tbGlzdEBweXRob24ub3JnLCBweXRob24tYW5ub3VuY2VAcHl0aG9uLm9yZywgeWFtbC1jb3JlQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorU3ViamVjdDogW0FOTl0gUHlZQU1MLTMuMTA6IFlBTUwgcGFyc2VyIGFuZCBlbWl0dGVyIGZvciBQeXRob24KKworPT09PT09PT09PT09PT09PT09PT09PT09CisgQW5ub3VuY2luZyBQeVlBTUwtMy4xMAorPT09PT09PT09PT09PT09PT09PT09PT09CisKK0EgbmV3IGJ1ZyBmaXggcmVsZWFzZSBvZiBQeVlBTUwgaXMgbm93IGF2YWlsYWJsZToKKworICAgIGh0dHA6Ly9weXlhbWwub3JnL3dpa2kvUHlZQU1MCisKKworQ2hhbmdlcworPT09PT09PQorCisqIERvIG5vdCB0cnkgdG8gYnVpbGQgTGliWUFNTCBiaW5kaW5ncyBvbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBDUHl0aG9uOworICB0aGlzIGZpeGVkIGluc3RhbGxhdGlvbiB1bmRlciBKeXRob24gKFRoYW5rIHRvIG9sdChhdClib2dvc29mdChkb3QpY29tKS4KKyogQ2xlYXIgY3ljbGljIHJlZmVyZW5jZXMgaW4gdGhlIHBhcnNlciBhbmQgdGhlIGVtaXR0ZXIKKyAgKFRoYW5rIHRvIGtyaXN0amFuKGF0KWNjcGdhbWVzKGRvdCljb20pLgorKiBMaWJZQU1MIGJpbmRpbmdzIGFyZSByZWJ1aWx0IHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEN5dGhvbi4KKyogRHJvcHBlZCBzdXBwb3J0IGZvciBQeXRob24gMi4zIGFuZCAyLjQ7IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmVyc2lvbnMKKyAgYXJlIDIuNSB0byAzLjIuCisKKworUmVzb3VyY2VzCis9PT09PT09PT0KKworUHlZQU1MIGhvbWVwYWdlOiBodHRwOi8vcHl5YW1sLm9yZy93aWtpL1B5WUFNTAorUHlZQU1MIGRvY3VtZW50YXRpb246IGh0dHA6Ly9weXlhbWwub3JnL3dpa2kvUHlZQU1MRG9jdW1lbnRhdGlvbgorCitUQVIuR1ogcGFja2FnZTogaHR0cDovL3B5eWFtbC5vcmcvZG93bmxvYWQvcHl5YW1sL1B5WUFNTC0zLjEwLnRhci5negorWklQIHBhY2thZ2U6IGh0dHA6Ly9weXlhbWwub3JnL2Rvd25sb2FkL3B5eWFtbC9QeVlBTUwtMy4xMC56aXAKK1dpbmRvd3MgaW5zdGFsbGVyczoKKyAgICBodHRwOi8vcHl5YW1sLm9yZy9kb3dubG9hZC9weXlhbWwvUHlZQU1MLTMuMTAud2luMzItcHkyLjUuZXhlCisgICAgaHR0cDovL3B5eWFtbC5vcmcvZG93bmxvYWQvcHl5YW1sL1B5WUFNTC0zLjEwLndpbjMyLXB5Mi42LmV4ZQorICAgIGh0dHA6Ly9weXlhbWwub3JnL2Rvd25sb2FkL3B5eWFtbC9QeVlBTUwtMy4xMC53aW4zMi1weTMuMC5leGUKKyAgICBodHRwOi8vcHl5YW1sLm9yZy9kb3dubG9hZC9weXlhbWwvUHlZQU1MLTMuMTAud2luMzItcHkzLjEuZXhlCisgICAgaHR0cDovL3B5eWFtbC5vcmcvZG93bmxvYWQvcHl5YW1sL1B5WUFNTC0zLjEwLndpbjMyLXB5My4yLmV4ZQorCitQeVlBTUwgU1ZOIHJlcG9zaXRvcnk6IGh0dHA6Ly9zdm4ucHl5YW1sLm9yZy9weXlhbWwKK1N1Ym1pdCBhIGJ1ZyByZXBvcnQ6IGh0dHA6Ly9weXlhbWwub3JnL25ld3RpY2tldD9jb21wb25lbnQ9cHl5YW1sCisKK1lBTUwgaG9tZXBhZ2U6IGh0dHA6Ly95YW1sLm9yZy8KK1lBTUwtY29yZSBtYWlsaW5nIGxpc3Q6IGh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8veWFtbC1jb3JlCisKKworQWJvdXQgUHlZQU1MCis9PT09PT09PT09PT0KKworWUFNTCBpcyBhIGRhdGEgc2VyaWFsaXphdGlvbiBmb3JtYXQgZGVzaWduZWQgZm9yIGh1bWFuIHJlYWRhYmlsaXR5IGFuZAoraW50ZXJhY3Rpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgUHlZQU1MIGlzIGEgWUFNTCBwYXJzZXIgYW5kCitlbWl0dGVyIGZvciBQeXRob24uCisKK1B5WUFNTCBmZWF0dXJlcyBhIGNvbXBsZXRlIFlBTUwgMS4xIHBhcnNlciwgVW5pY29kZSBzdXBwb3J0LCBwaWNrbGUKK3N1cHBvcnQsIGNhcGFibGUgZXh0ZW5zaW9uIEFQSSwgYW5kIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2VzLiAgUHlZQU1MCitzdXBwb3J0cyBzdGFuZGFyZCBZQU1MIHRhZ3MgYW5kIHByb3ZpZGVzIFB5dGhvbi1zcGVjaWZpYyB0YWdzIHRoYXQgYWxsb3cKK3RvIHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdC4KKworUHlZQU1MIGlzIGFwcGxpY2FibGUgZm9yIGEgYnJvYWQgcmFuZ2Ugb2YgdGFza3MgZnJvbSBjb21wbGV4Citjb25maWd1cmF0aW9uIGZpbGVzIHRvIG9iamVjdCBzZXJpYWxpemF0aW9uIGFuZCBwZXJzaXN0YW5jZS4KKworCitFeGFtcGxlCis9PT09PT09CisKKz4+PiBpbXBvcnQgeWFtbAorCis+Pj4geWFtbC5sb2FkKCIiIgorLi4uIG5hbWU6IFB5WUFNTAorLi4uIGRlc2NyaXB0aW9uOiBZQU1MIHBhcnNlciBhbmQgZW1pdHRlciBmb3IgUHl0aG9uCisuLi4gaG9tZXBhZ2U6IGh0dHA6Ly9weXlhbWwub3JnL3dpa2kvUHlZQU1MCisuLi4ga2V5d29yZHM6IFtZQU1MLCBzZXJpYWxpemF0aW9uLCBjb25maWd1cmF0aW9uLCBwZXJzaXN0YW5jZSwgcGlja2xlXQorLi4uICIiIikKK3sna2V5d29yZHMnOiBbJ1lBTUwnLCAnc2VyaWFsaXphdGlvbicsICdjb25maWd1cmF0aW9uJywgJ3BlcnNpc3RhbmNlJywKKydwaWNrbGUnXSwgJ2hvbWVwYWdlJzogJ2h0dHA6Ly9weXlhbWwub3JnL3dpa2kvUHlZQU1MJywgJ2Rlc2NyaXB0aW9uJzoKKydZQU1MIHBhcnNlciBhbmQgZW1pdHRlciBmb3IgUHl0aG9uJywgJ25hbWUnOiAnUHlZQU1MJ30KKworPj4+IHByaW50IHlhbWwuZHVtcChfKQorbmFtZTogUHlZQU1MCitob21lcGFnZTogaHR0cDovL3B5eWFtbC5vcmcvd2lraS9QeVlBTUwKK2Rlc2NyaXB0aW9uOiBZQU1MIHBhcnNlciBhbmQgZW1pdHRlciBmb3IgUHl0aG9uCitrZXl3b3JkczogW1lBTUwsIHNlcmlhbGl6YXRpb24sIGNvbmZpZ3VyYXRpb24sIHBlcnNpc3RhbmNlLCBwaWNrbGVdCisKKworQ29weXJpZ2h0Cis9PT09PT09PT0KKworVGhlIFB5WUFNTCBtb2R1bGUgaXMgd3JpdHRlbiBieSBLaXJpbGwgU2ltb25vdiA8eGlAcmVzb2x2ZW50Lm5ldD4uCisKK1B5WUFNTCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3B5Z21lbnRzLWxleGVyL2V4YW1wbGUueWFtbCBiL2V4YW1wbGVzL3B5Z21lbnRzLWxleGVyL2V4YW1wbGUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBlZDlkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHlnbWVudHMtbGV4ZXIvZXhhbXBsZS55YW1sCkBAIC0wLDAgKzEsMzAyIEBACisKKyMKKyMgRXhhbXBsZXMgZnJvbSB0aGUgUHJldmlldyBzZWN0aW9uIG9mIHRoZSBZQU1MIHNwZWNpZmljYXRpb24KKyMgKGh0dHA6Ly95YW1sLm9yZy9zcGVjLzEuMi8jUHJldmlldykKKyMKKworIyBTZXF1ZW5jZSBvZiBzY2FsYXJzCistLS0KKy0gTWFyayBNY0d3aXJlCistIFNhbW15IFNvc2EKKy0gS2VuIEdyaWZmZXkKKworIyBNYXBwaW5nIHNjYWxhcnMgdG8gc2NhbGFycworLS0tCitocjogIDY1ICAgICMgSG9tZSBydW5zCithdmc6IDAuMjc4ICMgQmF0dGluZyBhdmVyYWdlCityYmk6IDE0NyAgICMgUnVucyBCYXR0ZWQgSW4KKworIyBNYXBwaW5nIHNjYWxhcnMgdG8gc2VxdWVuY2VzCistLS0KK2FtZXJpY2FuOgorICAtIEJvc3RvbiBSZWQgU294CisgIC0gRGV0cm9pdCBUaWdlcnMKKyAgLSBOZXcgWW9yayBZYW5rZWVzCituYXRpb25hbDoKKyAgLSBOZXcgWW9yayBNZXRzCisgIC0gQ2hpY2FnbyBDdWJzCisgIC0gQXRsYW50YSBCcmF2ZXMKKworIyBTZXF1ZW5jZSBvZiBtYXBwaW5ncworLS0tCistCisgIG5hbWU6IE1hcmsgTWNHd2lyZQorICBocjogICA2NQorICBhdmc6ICAwLjI3OAorLQorICBuYW1lOiBTYW1teSBTb3NhCisgIGhyOiAgIDYzCisgIGF2ZzogIDAuMjg4CisKKyMgU2VxdWVuY2Ugb2Ygc2VxdWVuY2VzCistLS0KKy0gW25hbWUgICAgICAgICwgaHIsIGF2ZyAgXQorLSBbTWFyayBNY0d3aXJlLCA2NSwgMC4yNzhdCistIFtTYW1teSBTb3NhICAsIDYzLCAwLjI4OF0KKworIyBNYXBwaW5nIG9mIG1hcHBpbmdzCistLS0KK01hcmsgTWNHd2lyZToge2hyOiA2NSwgYXZnOiAwLjI3OH0KK1NhbW15IFNvc2E6IHsKKyAgICBocjogNjMsCisgICAgYXZnOiAwLjI4OAorICB9CisKKyMgVHdvIGRvY3VtZW50cyBpbiBhIHN0cmVhbQorLS0tICMgUmFua2luZyBvZiAxOTk4IGhvbWUgcnVucworLSBNYXJrIE1jR3dpcmUKKy0gU2FtbXkgU29zYQorLSBLZW4gR3JpZmZleQorLS0tICMgVGVhbSByYW5raW5nCistIENoaWNhZ28gQ3VicworLSBTdCBMb3VpcyBDYXJkaW5hbHMKKworIyBEb2N1bWVudHMgd2l0aCB0aGUgZW5kIGluZGljYXRvcgorLS0tCit0aW1lOiAyMDowMzoyMAorcGxheWVyOiBTYW1teSBTb3NhCithY3Rpb246IHN0cmlrZSAobWlzcykKKy4uLgorLS0tCit0aW1lOiAyMDowMzo0NworcGxheWVyOiBTYW1teSBTb3NhCithY3Rpb246IGdyYW5kIHNsYW0KKy4uLgorCisjIENvbW1lbnRzCistLS0KK2hyOiAjIDE5OTggaHIgcmFua2luZworICAtIE1hcmsgTWNHd2lyZQorICAtIFNhbW15IFNvc2EKK3JiaToKKyAgIyAxOTk4IHJiaSByYW5raW5nCisgIC0gU2FtbXkgU29zYQorICAtIEtlbiBHcmlmZmV5CisKKyMgQW5jaG9ycyBhbmQgYWxpYXNlcworLS0tCitocjoKKyAgLSBNYXJrIE1jR3dpcmUKKyAgIyBGb2xsb3dpbmcgbm9kZSBsYWJlbGVkIFNTCisgIC0gJlNTIFNhbW15IFNvc2EKK3JiaToKKyAgLSAqU1MgIyBTdWJzZXF1ZW50IG9jY3VycmVuY2UKKyAgLSBLZW4gR3JpZmZleQorCisjIE1hcHBpbmcgYmV0d2VlbiBzZXF1ZW5jZXMKKy0tLQorPyAtIERldHJvaXQgVGlnZXJzCisgIC0gQ2hpY2FnbyBjdWJzCis6CisgIC0gMjAwMS0wNy0yMworPyBbIE5ldyBZb3JrIFlhbmtlZXMsCisgICAgQXRsYW50YSBCcmF2ZXMgXQorOiBbIDIwMDEtMDctMDIsIDIwMDEtMDgtMTIsCisgICAgMjAwMS0wOC0xNCBdCisKKyMgSW5saW5lIG5lc3RlZCBtYXBwaW5nCistLS0KKyMgcHJvZHVjdHMgcHVyY2hhc2VkCistIGl0ZW0gICAgOiBTdXBlciBIb29wCisgIHF1YW50aXR5OiAxCistIGl0ZW0gICAgOiBCYXNrZXRiYWxsCisgIHF1YW50aXR5OiA0CistIGl0ZW0gICAgOiBCaWcgU2hvZXMKKyAgcXVhbnRpdHk6IDEKKworIyBMaXRlcmFsIHNjYWxhcnMKKy0tLSB8ICMgQVNDSUkgYXJ0CisgIFwvL3x8XC98fAorICAvLyB8fCAgfHxfXworCisjIEZvbGRlZCBzY2FsYXJzCistLS0gPgorICBNYXJrIE1jR3dpcmUncworICB5ZWFyIHdhcyBjcmlwcGxlZAorICBieSBhIGtuZWUgaW5qdXJ5LgorCisjIFByZXNlcnZlZCBpbmRlbnRlZCBibG9jayBpbiBhIGZvbGRlZCBzY2FsYXIKKy0tLQorPgorIFNhbW15IFNvc2EgY29tcGxldGVkIGFub3RoZXIKKyBmaW5lIHNlYXNvbiB3aXRoIGdyZWF0IHN0YXRzLgorCisgICA2MyBIb21lIFJ1bnMKKyAgIDAuMjg4IEJhdHRpbmcgQXZlcmFnZQorCisgV2hhdCBhIHllYXIhCisKKyMgSW5kZW50YXRpb24gZGV0ZXJtaW5lcyBzY29wZQorLS0tCituYW1lOiBNYXJrIE1jR3dpcmUKK2FjY29tcGxpc2htZW50OiA+CisgIE1hcmsgc2V0IGEgbWFqb3IgbGVhZ3VlCisgIGhvbWUgcnVuIHJlY29yZCBpbiAxOTk4Lgorc3RhdHM6IHwKKyAgNjUgSG9tZSBSdW5zCisgIDAuMjc4IEJhdHRpbmcgQXZlcmFnZQorCisjIFF1b3RlZCBzY2FsYXJzCistLS0KK3VuaWNvZGU6ICJTb3NhIGRpZCBmaW5lLlx1MjYzQSIKK2NvbnRyb2w6ICJcYjE5OThcdDE5OTlcdDIwMDBcbiIKK2hleCBlc2M6ICJceDBkXHgwYSBpcyBcclxuIgorc2luZ2xlOiAnIkhvd2R5ISIgaGUgY3JpZWQuJworcXVvdGVkOiAnICMgbm90IGEgJydjb21tZW50JycuJwordGllLWZpZ2h0ZXI6ICd8XC0qLS98JworCisjIE11bHRpLWxpbmUgZmxvdyBzY2FsYXJzCistLS0KK3BsYWluOgorICBUaGlzIHVucXVvdGVkIHNjYWxhcgorICBzcGFucyBtYW55IGxpbmVzLgorcXVvdGVkOiAiU28gZG9lcyB0aGlzCisgIHF1b3RlZCBzY2FsYXIuXG4iCisKKyMgSW50ZWdlcnMKKy0tLQorY2Fub25pY2FsOiAxMjM0NQorZGVjaW1hbDogKzEyXzM0NQorc2V4YWdlc2ltYWw6IDM6MjU6NDUKK29jdGFsOiAwMTQKK2hleGFkZWNpbWFsOiAweEMKKworIyBGbG9hdGluZyBwb2ludAorLS0tCitjYW5vbmljYWw6IDEuMjMwMTVlKzMKK2V4cG9uZW50aWFsOiAxMi4zMDE1ZSswMgorc2V4YWdlc2ltYWw6IDIwOjMwLjE1CitmaXhlZDogMV8yMzAuMTUKK25lZ2F0aXZlIGluZmluaXR5OiAtLmluZgorbm90IGEgbnVtYmVyOiAuTmFOCisKKyMgTWlzY2VsbGFuZW91cworLS0tCitudWxsOiB+Cit0cnVlOiBib29sZWFuCitmYWxzZTogYm9vbGVhbgorc3RyaW5nOiAnMTIzNDUnCisKKyMgVGltZXN0YW1wcworLS0tCitjYW5vbmljYWw6IDIwMDEtMTItMTVUMDI6NTk6NDMuMVoKK2lzbzg2MDE6IDIwMDEtMTItMTR0MjE6NTk6NDMuMTAtMDU6MDAKK3NwYWNlZDogMjAwMS0xMi0xNCAyMTo1OTo0My4xMCAtNQorZGF0ZTogMjAwMi0xMi0xNAorCisjIFZhcmlvdXMgZXhwbGljaXQgdGFncworLS0tCitub3QtZGF0ZTogISFzdHIgMjAwMi0wNC0yOAorcGljdHVyZTogISFiaW5hcnkgfAorIFIwbEdPRGxoREFBTUFJUUFBUC8vOS9YCisgMTd1bnA1V1ptWmdBQUFPZm41MTVlWHYKKyBQejdZNk9qdURnNEorZm41T1RrNmVucAorIDU2ZW5tbGVFQ2NnZ2dvQkFEcz0KK2FwcGxpY2F0aW9uIHNwZWNpZmljIHRhZzogIXNvbWV0aGluZyB8CisgVGhlIHNlbWFudGljcyBvZiB0aGUgdGFnCisgYWJvdmUgbWF5IGJlIGRpZmZlcmVudCBmb3IKKyBkaWZmZXJlbnQgZG9jdW1lbnRzLgorCisjIEdsb2JhbCB0YWdzCislVEFHICEgdGFnOmNsYXJrZXZhbnMuY29tLDIwMDI6CistLS0gIXNoYXBlCisgICMgVXNlIHRoZSAhIGhhbmRsZSBmb3IgcHJlc2VudGluZworICAjIHRhZzpjbGFya2V2YW5zLmNvbSwyMDAyOmNpcmNsZQorLSAhY2lyY2xlCisgIGNlbnRlcjogJk9SSUdJTiB7eDogNzMsIHk6IDEyOX0KKyAgcmFkaXVzOiA3CistICFsaW5lCisgIHN0YXJ0OiAqT1JJR0lOCisgIGZpbmlzaDogeyB4OiA4OSwgeTogMTAyIH0KKy0gIWxhYmVsCisgIHN0YXJ0OiAqT1JJR0lOCisgIGNvbG9yOiAweEZGRUVCQgorICB0ZXh0OiBQcmV0dHkgdmVjdG9yIGRyYXdpbmcuCisKKyMgVW5vcmRlcmVkIHNldHMKKy0tLSAhIXNldAorIyBzZXRzIGFyZSByZXByZXNlbnRlZCBhcyBhCisjIG1hcHBpbmcgd2hlcmUgZWFjaCBrZXkgaXMKKyMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKz8gTWFyayBNY0d3aXJlCis/IFNhbW15IFNvc2EKKz8gS2VuIEdyaWZmCisKKyMgT3JkZXJlZCBtYXBwaW5ncworLS0tICEhb21hcAorIyBvcmRlcmVkIG1hcHMgYXJlIHJlcHJlc2VudGVkIGFzCisjIGEgc2VxdWVuY2Ugb2YgbWFwcGluZ3MsIHdpdGgKKyMgZWFjaCBtYXBwaW5nIGhhdmluZyBvbmUga2V5CistIE1hcmsgTWNHd2lyZTogNjUKKy0gU2FtbXkgU29zYTogNjMKKy0gS2VuIEdyaWZmeTogNTgKKworIyBGdWxsIGxlbmd0aCBleGFtcGxlCistLS0gITx0YWc6Y2xhcmtldmFucy5jb20sMjAwMjppbnZvaWNlPgoraW52b2ljZTogMzQ4NDMKK2RhdGUgICA6IDIwMDEtMDEtMjMKK2JpbGwtdG86ICZpZDAwMQorICAgIGdpdmVuICA6IENocmlzCisgICAgZmFtaWx5IDogRHVtYXJzCisgICAgYWRkcmVzczoKKyAgICAgICAgbGluZXM6IHwKKyAgICAgICAgICAgIDQ1OCBXYWxrbWFuIERyLgorICAgICAgICAgICAgU3VpdGUgIzI5MgorICAgICAgICBjaXR5ICAgIDogUm95YWwgT2FrCisgICAgICAgIHN0YXRlICAgOiBNSQorICAgICAgICBwb3N0YWwgIDogNDgwNDYKK3NoaXAtdG86ICppZDAwMQorcHJvZHVjdDoKKyAgICAtIHNrdSAgICAgICAgIDogQkwzOTRECisgICAgICBxdWFudGl0eSAgICA6IDQKKyAgICAgIGRlc2NyaXB0aW9uIDogQmFza2V0YmFsbAorICAgICAgcHJpY2UgICAgICAgOiA0NTAuMDAKKyAgICAtIHNrdSAgICAgICAgIDogQkw0NDM4SAorICAgICAgcXVhbnRpdHkgICAgOiAxCisgICAgICBkZXNjcmlwdGlvbiA6IFN1cGVyIEhvb3AKKyAgICAgIHByaWNlICAgICAgIDogMjM5Mi4wMAordGF4ICA6IDI1MS40MgordG90YWw6IDQ0NDMuNTIKK2NvbW1lbnRzOgorICAgIExhdGUgYWZ0ZXJub29uIGlzIGJlc3QuCisgICAgQmFja3VwIGNvbnRhY3QgaXMgTmFuY3kKKyAgICBCaWxsc21lciBAIDMzOC00MzM4LgorCisjIEFub3RoZXIgZnVsbC1sZW5ndGggZXhhbXBsZQorLS0tCitUaW1lOiAyMDAxLTExLTIzIDE1OjAxOjQyIC01CitVc2VyOiBlZAorV2FybmluZzoKKyAgVGhpcyBpcyBhbiBlcnJvciBtZXNzYWdlCisgIGZvciB0aGUgbG9nIGZpbGUKKy0tLQorVGltZTogMjAwMS0xMS0yMyAxNTowMjozMSAtNQorVXNlcjogZWQKK1dhcm5pbmc6CisgIEEgc2xpZ2h0bHkgZGlmZmVyZW50IGVycm9yCisgIG1lc3NhZ2UuCistLS0KK0RhdGU6IDIwMDEtMTEtMjMgMTU6MDM6MTcgLTUKK1VzZXI6IGVkCitGYXRhbDoKKyAgVW5rbm93biB2YXJpYWJsZSAiYmFyIgorU3RhY2s6CisgIC0gZmlsZTogVG9wQ2xhc3MucHkKKyAgICBsaW5lOiAyMworICAgIGNvZGU6IHwKKyAgICAgIHggPSBNb3JlT2JqZWN0KCIzNDVcbiIpCisgIC0gZmlsZTogTW9yZUNsYXNzLnB5CisgICAgbGluZTogNTgKKyAgICBjb2RlOiB8LQorICAgICAgZm9vID0gYmFyCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3B5Z21lbnRzLWxleGVyL3lhbWwucHkgYi9leGFtcGxlcy9weWdtZW50cy1sZXhlci95YW1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTlkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9weWdtZW50cy1sZXhlci95YW1sLnB5CkBAIC0wLDAgKzEsNDMxIEBACisKKyIiIgoreWFtbC5weQorCitMZXhlciBmb3IgWUFNTCwgYSBodW1hbi1mcmllbmRseSBkYXRhIHNlcmlhbGl6YXRpb24gbGFuZ3VhZ2UKKyhodHRwOi8veWFtbC5vcmcvKS4KKworV3JpdHRlbiBieSBLaXJpbGwgU2ltb25vdiA8eGlAcmVzb2x2ZW50Lm5ldD4uCisKK0xpY2Vuc2U6IFdoYXRldmVyIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW50byB0aGUgUHlnbWVudHMgcGFja2FnZS4KKyIiIgorCitmcm9tIHB5Z21lbnRzLmxleGVyIGltcG9ydCAgXAorICAgICAgICBFeHRlbmRlZFJlZ2V4TGV4ZXIsIExleGVyQ29udGV4dCwgaW5jbHVkZSwgYnlncm91cHMKK2Zyb20gcHlnbWVudHMudG9rZW4gaW1wb3J0ICBcCisgICAgICAgIFRleHQsIENvbW1lbnQsIFB1bmN0dWF0aW9uLCBOYW1lLCBMaXRlcmFsCisKK19fYWxsX18gPSBbJ1lBTUxMZXhlciddCisKKworY2xhc3MgWUFNTExleGVyQ29udGV4dChMZXhlckNvbnRleHQpOgorICAgICIiIkluZGVudGF0aW9uIGNvbnRleHQgZm9yIHRoZSBZQU1MIGxleGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICBzdXBlcihZQU1MTGV4ZXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2RzKQorICAgICAgICBzZWxmLmluZGVudF9zdGFjayA9IFtdCisgICAgICAgIHNlbGYuaW5kZW50ID0gLTEKKyAgICAgICAgc2VsZi5uZXh0X2luZGVudCA9IDAKKyAgICAgICAgc2VsZi5ibG9ja19zY2FsYXJfaW5kZW50ID0gTm9uZQorCisKK2RlZiBzb21ldGhpbmcoVG9rZW5DbGFzcyk6CisgICAgIiIiRG8gbm90IHByb2R1Y2UgZW1wdHkgdG9rZW5zLiIiIgorICAgIGRlZiBjYWxsYmFjayhsZXhlciwgbWF0Y2gsIGNvbnRleHQpOgorICAgICAgICB0ZXh0ID0gbWF0Y2guZ3JvdXAoKQorICAgICAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB5aWVsZCBtYXRjaC5zdGFydCgpLCBUb2tlbkNsYXNzLCB0ZXh0CisgICAgICAgIGNvbnRleHQucG9zID0gbWF0Y2guZW5kKCkKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHJlc2V0X2luZGVudChUb2tlbkNsYXNzKToKKyAgICAiIiJSZXNldCB0aGUgaW5kZW50YXRpb24gbGV2ZWxzLiIiIgorICAgIGRlZiBjYWxsYmFjayhsZXhlciwgbWF0Y2gsIGNvbnRleHQpOgorICAgICAgICB0ZXh0ID0gbWF0Y2guZ3JvdXAoKQorICAgICAgICBjb250ZXh0LmluZGVudF9zdGFjayA9IFtdCisgICAgICAgIGNvbnRleHQuaW5kZW50ID0gLTEKKyAgICAgICAgY29udGV4dC5uZXh0X2luZGVudCA9IDAKKyAgICAgICAgY29udGV4dC5ibG9ja19zY2FsYXJfaW5kZW50ID0gTm9uZQorICAgICAgICB5aWVsZCBtYXRjaC5zdGFydCgpLCBUb2tlbkNsYXNzLCB0ZXh0CisgICAgICAgIGNvbnRleHQucG9zID0gbWF0Y2guZW5kKCkKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHNhdmVfaW5kZW50KFRva2VuQ2xhc3MsIHN0YXJ0PUZhbHNlKToKKyAgICAiIiJTYXZlIGEgcG9zc2libGUgaW5kZW50YXRpb24gbGV2ZWwuIiIiCisgICAgZGVmIGNhbGxiYWNrKGxleGVyLCBtYXRjaCwgY29udGV4dCk6CisgICAgICAgIHRleHQgPSBtYXRjaC5ncm91cCgpCisgICAgICAgIGV4dHJhID0gJycKKyAgICAgICAgaWYgc3RhcnQ6CisgICAgICAgICAgICBjb250ZXh0Lm5leHRfaW5kZW50ID0gbGVuKHRleHQpCisgICAgICAgICAgICBpZiBjb250ZXh0Lm5leHRfaW5kZW50IDwgY29udGV4dC5pbmRlbnQ6CisgICAgICAgICAgICAgICAgd2hpbGUgY29udGV4dC5uZXh0X2luZGVudCA8IGNvbnRleHQuaW5kZW50OgorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmluZGVudCA9IGNvbnRleHQuaW5kZW50X3N0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgaWYgY29udGV4dC5uZXh0X2luZGVudCA+IGNvbnRleHQuaW5kZW50OgorICAgICAgICAgICAgICAgICAgICBleHRyYSA9IHRleHRbY29udGV4dC5pbmRlbnQ6XQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dFs6Y29udGV4dC5pbmRlbnRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250ZXh0Lm5leHRfaW5kZW50ICs9IGxlbih0ZXh0KQorICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgeWllbGQgbWF0Y2guc3RhcnQoKSwgVG9rZW5DbGFzcywgdGV4dAorICAgICAgICBpZiBleHRyYToKKyAgICAgICAgICAgIHlpZWxkIG1hdGNoLnN0YXJ0KCkrbGVuKHRleHQpLCBUb2tlbkNsYXNzLkVycm9yLCBleHRyYQorICAgICAgICBjb250ZXh0LnBvcyA9IG1hdGNoLmVuZCgpCisgICAgcmV0dXJuIGNhbGxiYWNrCisKK2RlZiBzZXRfaW5kZW50KFRva2VuQ2xhc3MsIGltcGxpY2l0PUZhbHNlKToKKyAgICAiIiJTZXQgdGhlIHByZXZpb3VzbHkgc2F2ZWQgaW5kZW50YXRpb24gbGV2ZWwuIiIiCisgICAgZGVmIGNhbGxiYWNrKGxleGVyLCBtYXRjaCwgY29udGV4dCk6CisgICAgICAgIHRleHQgPSBtYXRjaC5ncm91cCgpCisgICAgICAgIGlmIGNvbnRleHQuaW5kZW50IDwgY29udGV4dC5uZXh0X2luZGVudDoKKyAgICAgICAgICAgIGNvbnRleHQuaW5kZW50X3N0YWNrLmFwcGVuZChjb250ZXh0LmluZGVudCkKKyAgICAgICAgICAgIGNvbnRleHQuaW5kZW50ID0gY29udGV4dC5uZXh0X2luZGVudAorICAgICAgICBpZiBub3QgaW1wbGljaXQ6CisgICAgICAgICAgICBjb250ZXh0Lm5leHRfaW5kZW50ICs9IGxlbih0ZXh0KQorICAgICAgICB5aWVsZCBtYXRjaC5zdGFydCgpLCBUb2tlbkNsYXNzLCB0ZXh0CisgICAgICAgIGNvbnRleHQucG9zID0gbWF0Y2guZW5kKCkKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHNldF9ibG9ja19zY2FsYXJfaW5kZW50KFRva2VuQ2xhc3MpOgorICAgICIiIlNldCBhbiBleHBsaWNpdCBpbmRlbnRhdGlvbiBsZXZlbCBmb3IgYSBibG9jayBzY2FsYXIuIiIiCisgICAgZGVmIGNhbGxiYWNrKGxleGVyLCBtYXRjaCwgY29udGV4dCk6CisgICAgICAgIHRleHQgPSBtYXRjaC5ncm91cCgpCisgICAgICAgIGNvbnRleHQuYmxvY2tfc2NhbGFyX2luZGVudCA9IE5vbmUKKyAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5jcmVtZW50ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgaW5jcmVtZW50OgorICAgICAgICAgICAgY3VycmVudF9pbmRlbnQgPSBtYXgoY29udGV4dC5pbmRlbnQsIDApCisgICAgICAgICAgICBpbmNyZW1lbnQgPSBpbnQoaW5jcmVtZW50KQorICAgICAgICAgICAgY29udGV4dC5ibG9ja19zY2FsYXJfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyBpbmNyZW1lbnQKKyAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgIHlpZWxkIG1hdGNoLnN0YXJ0KCksIFRva2VuQ2xhc3MsIHRleHQKKyAgICAgICAgICAgIGNvbnRleHQucG9zID0gbWF0Y2guZW5kKCkKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHBhcnNlX2Jsb2NrX3NjYWxhcl9lbXB0eV9saW5lKEluZGVudFRva2VuQ2xhc3MsIENvbnRlbnRUb2tlbkNsYXNzKToKKyAgICAiIiJQcm9jZXNzIGFuIGVtcHR5IGxpbmUgaW4gYSBibG9jayBzY2FsYXIuIiIiCisgICAgZGVmIGNhbGxiYWNrKGxleGVyLCBtYXRjaCwgY29udGV4dCk6CisgICAgICAgIHRleHQgPSBtYXRjaC5ncm91cCgpCisgICAgICAgIGlmIChjb250ZXh0LmJsb2NrX3NjYWxhcl9pbmRlbnQgaXMgTm9uZSBvcgorICAgICAgICAgICAgICAgIGxlbih0ZXh0KSA8PSBjb250ZXh0LmJsb2NrX3NjYWxhcl9pbmRlbnQpOgorICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICB5aWVsZCBtYXRjaC5zdGFydCgpLCBJbmRlbnRUb2tlbkNsYXNzLCB0ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRlbnRhdGlvbiA9IHRleHRbOmNvbnRleHQuYmxvY2tfc2NhbGFyX2luZGVudF0KKyAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXh0W2NvbnRleHQuYmxvY2tfc2NhbGFyX2luZGVudDpdCisgICAgICAgICAgICB5aWVsZCBtYXRjaC5zdGFydCgpLCBJbmRlbnRUb2tlbkNsYXNzLCBpbmRlbnRhdGlvbgorICAgICAgICAgICAgeWllbGQgKG1hdGNoLnN0YXJ0KCkrY29udGV4dC5ibG9ja19zY2FsYXJfaW5kZW50LAorICAgICAgICAgICAgICAgICAgICBDb250ZW50VG9rZW5DbGFzcywgY29udGVudCkKKyAgICAgICAgY29udGV4dC5wb3MgPSBtYXRjaC5lbmQoKQorICAgIHJldHVybiBjYWxsYmFjaworCitkZWYgcGFyc2VfYmxvY2tfc2NhbGFyX2luZGVudChUb2tlbkNsYXNzKToKKyAgICAiIiJQcm9jZXNzIGluZGVudGF0aW9uIHNwYWNlcyBpbiBhIGJsb2NrIHNjYWxhci4iIiIKKyAgICBkZWYgY2FsbGJhY2sobGV4ZXIsIG1hdGNoLCBjb250ZXh0KToKKyAgICAgICAgdGV4dCA9IG1hdGNoLmdyb3VwKCkKKyAgICAgICAgaWYgY29udGV4dC5ibG9ja19zY2FsYXJfaW5kZW50IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBsZW4odGV4dCkgPD0gbWF4KGNvbnRleHQuaW5kZW50LCAwKToKKyAgICAgICAgICAgICAgICBjb250ZXh0LnN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgY29udGV4dC5ibG9ja19zY2FsYXJfaW5kZW50ID0gbGVuKHRleHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsZW4odGV4dCkgPCBjb250ZXh0LmJsb2NrX3NjYWxhcl9pbmRlbnQ6CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgIHlpZWxkIG1hdGNoLnN0YXJ0KCksIFRva2VuQ2xhc3MsIHRleHQKKyAgICAgICAgICAgIGNvbnRleHQucG9zID0gbWF0Y2guZW5kKCkKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHBhcnNlX3BsYWluX3NjYWxhcl9pbmRlbnQoVG9rZW5DbGFzcyk6CisgICAgIiIiUHJvY2VzcyBpbmRlbnRhdGlvbiBzcGFjZXMgaW4gYSBwbGFpbiBzY2FsYXIuIiIiCisgICAgZGVmIGNhbGxiYWNrKGxleGVyLCBtYXRjaCwgY29udGV4dCk6CisgICAgICAgIHRleHQgPSBtYXRjaC5ncm91cCgpCisgICAgICAgIGlmIGxlbih0ZXh0KSA8PSBjb250ZXh0LmluZGVudDoKKyAgICAgICAgICAgIGNvbnRleHQuc3RhY2sucG9wKCkKKyAgICAgICAgICAgIGNvbnRleHQuc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgeWllbGQgbWF0Y2guc3RhcnQoKSwgVG9rZW5DbGFzcywgdGV4dAorICAgICAgICAgICAgY29udGV4dC5wb3MgPSBtYXRjaC5lbmQoKQorICAgIHJldHVybiBjYWxsYmFjaworCisKK2NsYXNzIFlBTUxMZXhlcihFeHRlbmRlZFJlZ2V4TGV4ZXIpOgorICAgICIiIkxleGVyIGZvciB0aGUgWUFNTCBsYW5ndWFnZS4iIiIKKworICAgIG5hbWUgPSAnWUFNTCcKKyAgICBhbGlhc2VzID0gWyd5YW1sJ10KKyAgICBmaWxlbmFtZXMgPSBbJyoueWFtbCcsICcqLnltbCddCisgICAgbWltZXR5cGVzID0gWyd0ZXh0L3gteWFtbCddCisKKyAgICB0b2tlbnMgPSB7CisKKyAgICAgICAgIyB0aGUgcm9vdCBydWxlcworICAgICAgICAncm9vdCc6IFsKKyAgICAgICAgICAgICMgaWdub3JlZCB3aGl0ZXNwYWNlcworICAgICAgICAgICAgKHInWyBdKyg/PSN8JCknLCBUZXh0LkJsYW5rKSwKKyAgICAgICAgICAgICMgbGluZSBicmVha3MKKyAgICAgICAgICAgIChyJ1xuKycsIFRleHQuQnJlYWspLAorICAgICAgICAgICAgIyBhIGNvbW1lbnQKKyAgICAgICAgICAgIChyJyNbXlxuXSonLCBDb21tZW50LlNpbmdsZSksCisgICAgICAgICAgICAjIHRoZSAnJVlBTUwnIGRpcmVjdGl2ZQorICAgICAgICAgICAgKHInXiVZQU1MKD89WyBdfCQpJywgcmVzZXRfaW5kZW50KE5hbWUuRGlyZWN0aXZlKSwKKyAgICAgICAgICAgICAgICAneWFtbC1kaXJlY3RpdmUnKSwKKyAgICAgICAgICAgICMgdGhlICVUQUcgZGlyZWN0aXZlCisgICAgICAgICAgICAocideJVRBRyg/PVsgXXwkKScsIHJlc2V0X2luZGVudChOYW1lLkRpcmVjdGl2ZSksCisgICAgICAgICAgICAgICAgJ3RhZy1kaXJlY3RpdmUnKSwKKyAgICAgICAgICAgICMgZG9jdW1lbnQgc3RhcnQgYW5kIGRvY3VtZW50IGVuZCBpbmRpY2F0b3JzCisgICAgICAgICAgICAocideKD86LS0tfFwuXC5cLikoPz1bIF18JCknLAorICAgICAgICAgICAgICAgIHJlc2V0X2luZGVudChQdW5jdHVhdGlvbi5Eb2N1bWVudCksICdibG9jay1saW5lJyksCisgICAgICAgICAgICAjIGluZGVudGF0aW9uIHNwYWNlcworICAgICAgICAgICAgKHInWyBdKig/IVsgXHRcblxyXGZcdl18JCknLAorICAgICAgICAgICAgICAgIHNhdmVfaW5kZW50KFRleHQuSW5kZW50LCBzdGFydD1UcnVlKSwKKyAgICAgICAgICAgICAgICAoJ2Jsb2NrLWxpbmUnLCAnaW5kZW50YXRpb24nKSksCisgICAgICAgIF0sCisKKyAgICAgICAgIyB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhZnRlciBkaXJlY3RpdmVzIG9yIGEgYmxvY2sgc2NhbGFyIGluZGljYXRvcgorICAgICAgICAnaWdub3JlZC1saW5lJzogWworICAgICAgICAgICAgIyBpZ25vcmVkIHdoaXRlc3BhY2VzCisgICAgICAgICAgICAocidbIF0rKD89I3wkKScsIFRleHQuQmxhbmspLAorICAgICAgICAgICAgIyBhIGNvbW1lbnQKKyAgICAgICAgICAgIChyJyNbXlxuXSonLCBDb21tZW50LlNpbmdsZSksCisgICAgICAgICAgICAjIGxpbmUgYnJlYWsKKyAgICAgICAgICAgIChyJ1xuJywgVGV4dC5CcmVhaywgJyNwb3A6MicpLAorICAgICAgICBdLAorCisgICAgICAgICMgdGhlICVZQU1MIGRpcmVjdGl2ZQorICAgICAgICAneWFtbC1kaXJlY3RpdmUnOiBbCisgICAgICAgICAgICAjIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgICAgICAgICAgKHInKFsgXSspKFswLTldK1wuWzAtOV0rKScsCisgICAgICAgICAgICAgICAgYnlncm91cHMoVGV4dC5CbGFuaywgTGl0ZXJhbC5WZXJzaW9uKSwgJ2lnbm9yZWQtbGluZScpLAorICAgICAgICBdLAorCisgICAgICAgICMgdGhlICVZQUcgZGlyZWN0aXZlCisgICAgICAgICd0YWctZGlyZWN0aXZlJzogWworICAgICAgICAgICAgIyBhIHRhZyBoYW5kbGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHByZWZpeAorICAgICAgICAgICAgKHInKFsgXSspKCF8IVswLTlBLVphLXpfLV0qISknCisgICAgICAgICAgICAgICAgcicoWyBdKykoIXwhP1swLTlBLVphLXo7Lz86QCY9KyQsXy4hfipcJygpXFtcXSUtXSspJywKKyAgICAgICAgICAgICAgICBieWdyb3VwcyhUZXh0LkJsYW5rLCBOYW1lLlR5cGUsIFRleHQuQmxhbmssIE5hbWUuVHlwZSksCisgICAgICAgICAgICAgICAgJ2lnbm9yZWQtbGluZScpLAorICAgICAgICBdLAorCisgICAgICAgICMgYmxvY2sgc2NhbGFyIGluZGljYXRvcnMgYW5kIGluZGVudGF0aW9uIHNwYWNlcworICAgICAgICAnaW5kZW50YXRpb24nOiBbCisgICAgICAgICAgICAjIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFyZSBpZ25vcmVkCisgICAgICAgICAgICAocidbIF0qJCcsIHNvbWV0aGluZyhUZXh0LkJsYW5rKSwgJyNwb3A6MicpLAorICAgICAgICAgICAgIyB3aGl0ZXNwYWNlcyBwcmVjZWVkaW5nIGJsb2NrIGNvbGxlY3Rpb24gaW5kaWNhdG9ycworICAgICAgICAgICAgKHInWyBdKyg/PVs/Oi1dKD86WyBdfCQpKScsIHNhdmVfaW5kZW50KFRleHQuSW5kZW50KSksCisgICAgICAgICAgICAjIGJsb2NrIGNvbGxlY3Rpb24gaW5kaWNhdG9ycworICAgICAgICAgICAgKHInWz86LV0oPz1bIF18JCknLCBzZXRfaW5kZW50KFB1bmN0dWF0aW9uLkluZGljYXRvcikpLAorICAgICAgICAgICAgIyB0aGUgYmVnaW5uaW5nIGEgYmxvY2sgbGluZQorICAgICAgICAgICAgKHInWyBdKicsIHNhdmVfaW5kZW50KFRleHQuSW5kZW50KSwgJyNwb3AnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGFuIGluZGVudGVkIGxpbmUgaW4gdGhlIGJsb2NrIGNvbnRleHQKKyAgICAgICAgJ2Jsb2NrLWxpbmUnOiBbCisgICAgICAgICAgICAjIHRoZSBsaW5lIGVuZAorICAgICAgICAgICAgKHInWyBdKig/PSN8JCknLCBzb21ldGhpbmcoVGV4dC5CbGFuayksICcjcG9wJyksCisgICAgICAgICAgICAjIHdoaXRlc3BhY2VzIHNlcGFyYXRpbmcgdG9rZW5zCisgICAgICAgICAgICAocidbIF0rJywgVGV4dC5CbGFuayksCisgICAgICAgICAgICAjIHRhZ3MsIGFuY2hvcnMgYW5kIGFsaWFzZXMsCisgICAgICAgICAgICBpbmNsdWRlKCdkZXNjcmlwdG9ycycpLAorICAgICAgICAgICAgIyBibG9jayBjb2xsZWN0aW9ucyBhbmQgc2NhbGFycworICAgICAgICAgICAgaW5jbHVkZSgnYmxvY2stbm9kZXMnKSwKKyAgICAgICAgICAgICMgZmxvdyBjb2xsZWN0aW9ucyBhbmQgcXVvdGVkIHNjYWxhcnMKKyAgICAgICAgICAgIGluY2x1ZGUoJ2Zsb3ctbm9kZXMnKSwKKyAgICAgICAgICAgICMgYSBwbGFpbiBzY2FsYXIKKyAgICAgICAgICAgIChyJyg/PVteIFx0XG5cclxmXHY/OixcW1xde30jJiohfD5cJyIlQGAtXXxbPzotXVteIFx0XG5cclxmXHZdKScsCisgICAgICAgICAgICAgICAgc29tZXRoaW5nKExpdGVyYWwuU2NhbGFyLlBsYWluKSwKKyAgICAgICAgICAgICAgICAncGxhaW4tc2NhbGFyLWluLWJsb2NrLWNvbnRleHQnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIHRhZ3MsIGFuY2hvcnMsIGFsaWFzZXMKKyAgICAgICAgJ2Rlc2NyaXB0b3JzJyA6IFsKKyAgICAgICAgICAgICMgYSBmdWxsLWZvcm0gdGFnCisgICAgICAgICAgICAocichPFswLTlBLVphLXo7Lz86QCY9KyQsXy4hfipcJygpXFtcXSUtXSs+JywgTmFtZS5UeXBlKSwKKyAgICAgICAgICAgICMgYSB0YWcgaW4gdGhlIGZvcm0gJyEnLCAnIXN1ZmZpeCcgb3IgJyFoYW5kbGUhc3VmZml4JworICAgICAgICAgICAgKHInISg/OlswLTlBLVphLXpfLV0rKT8nCisgICAgICAgICAgICAgICAgcicoPzohWzAtOUEtWmEtejsvPzpAJj0rJCxfLiF+KlwnKClcW1xdJS1dKyk/JywgTmFtZS5UeXBlKSwKKyAgICAgICAgICAgICMgYW4gYW5jaG9yCisgICAgICAgICAgICAocicmWzAtOUEtWmEtel8tXSsnLCBOYW1lLkFuY2hvciksCisgICAgICAgICAgICAjIGFuIGFsaWFzCisgICAgICAgICAgICAocidcKlswLTlBLVphLXpfLV0rJywgTmFtZS5BbGlhcyksCisgICAgICAgIF0sCisKKyAgICAgICAgIyBibG9jayBjb2xsZWN0aW9ucyBhbmQgc2NhbGFycworICAgICAgICAnYmxvY2stbm9kZXMnOiBbCisgICAgICAgICAgICAjIGltcGxpY2l0IGtleQorICAgICAgICAgICAgKHInOig/PVsgXXwkKScsIHNldF9pbmRlbnQoUHVuY3R1YXRpb24uSW5kaWNhdG9yLCBpbXBsaWNpdD1UcnVlKSksCisgICAgICAgICAgICAjIGxpdGVyYWwgYW5kIGZvbGRlZCBzY2FsYXJzCisgICAgICAgICAgICAocidbfD5dJywgUHVuY3R1YXRpb24uSW5kaWNhdG9yLAorICAgICAgICAgICAgICAgICgnYmxvY2stc2NhbGFyLWNvbnRlbnQnLCAnYmxvY2stc2NhbGFyLWhlYWRlcicpKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGZsb3cgY29sbGVjdGlvbnMgYW5kIHF1b3RlZCBzY2FsYXJzCisgICAgICAgICdmbG93LW5vZGVzJzogWworICAgICAgICAgICAgIyBhIGZsb3cgc2VxdWVuY2UKKyAgICAgICAgICAgIChyJ1xbJywgUHVuY3R1YXRpb24uSW5kaWNhdG9yLCAnZmxvdy1zZXF1ZW5jZScpLAorICAgICAgICAgICAgIyBhIGZsb3cgbWFwcGluZworICAgICAgICAgICAgKHInXHsnLCBQdW5jdHVhdGlvbi5JbmRpY2F0b3IsICdmbG93LW1hcHBpbmcnKSwKKyAgICAgICAgICAgICMgYSBzaW5nbGUtcXVvdGVkIHNjYWxhcgorICAgICAgICAgICAgKHInXCcnLCBMaXRlcmFsLlNjYWxhci5GbG93LlF1b3RlLCAnc2luZ2xlLXF1b3RlZC1zY2FsYXInKSwKKyAgICAgICAgICAgICMgYSBkb3VibGUtcXVvdGVkIHNjYWxhcgorICAgICAgICAgICAgKHInXCInLCBMaXRlcmFsLlNjYWxhci5GbG93LlF1b3RlLCAnZG91YmxlLXF1b3RlZC1zY2FsYXInKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIHRoZSBjb250ZW50IG9mIGEgZmxvdyBjb2xsZWN0aW9uCisgICAgICAgICdmbG93LWNvbGxlY3Rpb24nOiBbCisgICAgICAgICAgICAjIHdoaXRlc3BhY2VzCisgICAgICAgICAgICAocidbIF0rJywgVGV4dC5CbGFuayksCisgICAgICAgICAgICAjIGxpbmUgYnJlYWtzCisgICAgICAgICAgICAocidcbisnLCBUZXh0LkJyZWFrKSwKKyAgICAgICAgICAgICMgYSBjb21tZW50CisgICAgICAgICAgICAocicjW15cbl0qJywgQ29tbWVudC5TaW5nbGUpLAorICAgICAgICAgICAgIyBzaW1wbGUgaW5kaWNhdG9ycworICAgICAgICAgICAgKHInWz86LF0nLCBQdW5jdHVhdGlvbi5JbmRpY2F0b3IpLAorICAgICAgICAgICAgIyB0YWdzLCBhbmNob3JzIGFuZCBhbGlhc2VzCisgICAgICAgICAgICBpbmNsdWRlKCdkZXNjcmlwdG9ycycpLAorICAgICAgICAgICAgIyBuZXN0ZWQgY29sbGVjdGlvbnMgYW5kIHF1b3RlZCBzY2FsYXJzCisgICAgICAgICAgICBpbmNsdWRlKCdmbG93LW5vZGVzJyksCisgICAgICAgICAgICAjIGEgcGxhaW4gc2NhbGFyCisgICAgICAgICAgICAocicoPz1bXiBcdFxuXHJcZlx2PzosXFtcXXt9IyYqIXw+XCciJUBgXSknLAorICAgICAgICAgICAgICAgIHNvbWV0aGluZyhMaXRlcmFsLlNjYWxhci5QbGFpbiksCisgICAgICAgICAgICAgICAgJ3BsYWluLXNjYWxhci1pbi1mbG93LWNvbnRleHQnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGEgZmxvdyBzZXF1ZW5jZSBpbmRpY2F0ZWQgYnkgJ1snIGFuZCAnXScKKyAgICAgICAgJ2Zsb3ctc2VxdWVuY2UnOiBbCisgICAgICAgICAgICAjIGluY2x1ZGUgZmxvdyBjb2xsZWN0aW9uIHJ1bGVzCisgICAgICAgICAgICBpbmNsdWRlKCdmbG93LWNvbGxlY3Rpb24nKSwKKyAgICAgICAgICAgICMgdGhlIGNsb3NpbmcgaW5kaWNhdG9yCisgICAgICAgICAgICAocidcXScsIFB1bmN0dWF0aW9uLkluZGljYXRvciwgJyNwb3AnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGEgZmxvdyBtYXBwaW5nIGluZGljYXRlZCBieSAneycgYW5kICd9JworICAgICAgICAnZmxvdy1tYXBwaW5nJzogWworICAgICAgICAgICAgIyBpbmNsdWRlIGZsb3cgY29sbGVjdGlvbiBydWxlcworICAgICAgICAgICAgaW5jbHVkZSgnZmxvdy1jb2xsZWN0aW9uJyksCisgICAgICAgICAgICAjIHRoZSBjbG9zaW5nIGluZGljYXRvcgorICAgICAgICAgICAgKHInXH0nLCBQdW5jdHVhdGlvbi5JbmRpY2F0b3IsICcjcG9wJyksCisgICAgICAgIF0sCisKKyAgICAgICAgIyBibG9jayBzY2FsYXIgbGluZXMKKyAgICAgICAgJ2Jsb2NrLXNjYWxhci1jb250ZW50JzogWworICAgICAgICAgICAgIyBsaW5lIGJyZWFrCisgICAgICAgICAgICAocidcbicsIFRleHQuQnJlYWspLAorICAgICAgICAgICAgIyBlbXB0eSBsaW5lCisgICAgICAgICAgICAocideWyBdKyQnLAorICAgICAgICAgICAgICAgIHBhcnNlX2Jsb2NrX3NjYWxhcl9lbXB0eV9saW5lKFRleHQuSW5kZW50LAorICAgICAgICAgICAgICAgICAgICBMaXRlcmFsLlNjYWxhci5CbG9jaykpLAorICAgICAgICAgICAgIyBpbmRlbnRhdGlvbiBzcGFjZXMgKHdlIG1heSBsZWF2ZSB0aGUgc3RhdGUgaGVyZSkKKyAgICAgICAgICAgIChyJ15bIF0qJywgcGFyc2VfYmxvY2tfc2NhbGFyX2luZGVudChUZXh0LkluZGVudCkpLAorICAgICAgICAgICAgIyBsaW5lIGNvbnRlbnQKKyAgICAgICAgICAgIChyJ1teXG5cclxmXHZdKycsIExpdGVyYWwuU2NhbGFyLkJsb2NrKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIHRoZSBjb250ZW50IG9mIGEgbGl0ZXJhbCBvciBmb2xkZWQgc2NhbGFyCisgICAgICAgICdibG9jay1zY2FsYXItaGVhZGVyJzogWworICAgICAgICAgICAgIyBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgZm9sbG93ZWQgYnkgY2hvbXBpbmcgZmxhZworICAgICAgICAgICAgKHInKFsxLTldKT9bKy1dPyg/PVsgXXwkKScsCisgICAgICAgICAgICAgICAgc2V0X2Jsb2NrX3NjYWxhcl9pbmRlbnQoUHVuY3R1YXRpb24uSW5kaWNhdG9yKSwKKyAgICAgICAgICAgICAgICAnaWdub3JlZC1saW5lJyksCisgICAgICAgICAgICAjIGNob21waW5nIGZsYWcgZm9sbG93ZWQgYnkgaW5kZW50YXRpb24gaW5kaWNhdG9yCisgICAgICAgICAgICAocidbKy1dPyhbMS05XSk/KD89WyBdfCQpJywKKyAgICAgICAgICAgICAgICBzZXRfYmxvY2tfc2NhbGFyX2luZGVudChQdW5jdHVhdGlvbi5JbmRpY2F0b3IpLAorICAgICAgICAgICAgICAgICdpZ25vcmVkLWxpbmUnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGlnbm9yZWQgYW5kIHJlZ3VsYXIgd2hpdGVzcGFjZXMgaW4gcXVvdGVkIHNjYWxhcnMKKyAgICAgICAgJ3F1b3RlZC1zY2FsYXItd2hpdGVzcGFjZXMnOiBbCisgICAgICAgICAgICAjIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFyZSBpZ25vcmVkCisgICAgICAgICAgICAocideWyBdK3xbIF0rJCcsIFRleHQuQmxhbmspLAorICAgICAgICAgICAgIyBsaW5lIGJyZWFrcyBhcmUgaWdub3JlZAorICAgICAgICAgICAgKHInXG4rJywgVGV4dC5CcmVhayksCisgICAgICAgICAgICAjIG90aGVyIHdoaXRlc3BhY2VzIGFyZSBhIHBhcnQgb2YgdGhlIHZhbHVlCisgICAgICAgICAgICAocidbIF0rJywgTGl0ZXJhbC5TY2FsYXIuRmxvdyksCisgICAgICAgIF0sCisKKyAgICAgICAgIyBzaW5nbGUtcXVvdGVkIHNjYWxhcnMKKyAgICAgICAgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzogWworICAgICAgICAgICAgIyBpbmNsdWRlIHdoaXRlc3BhY2UgYW5kIGxpbmUgYnJlYWsgcnVsZXMKKyAgICAgICAgICAgIGluY2x1ZGUoJ3F1b3RlZC1zY2FsYXItd2hpdGVzcGFjZXMnKSwKKyAgICAgICAgICAgICMgZXNjYXBpbmcgb2YgdGhlIHF1b3RlIGNoYXJhY3RlcgorICAgICAgICAgICAgKHInXCdcJycsIExpdGVyYWwuU2NhbGFyLkZsb3cuRXNjYXBlKSwKKyAgICAgICAgICAgICMgcmVndWxhciBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAocidbXiBcdFxuXHJcZlx2XCddKycsIExpdGVyYWwuU2NhbGFyLkZsb3cpLAorICAgICAgICAgICAgIyB0aGUgY2xvc2luZyBxdW90ZQorICAgICAgICAgICAgKHInXCcnLCBMaXRlcmFsLlNjYWxhci5GbG93LlF1b3RlLCAnI3BvcCcpLAorICAgICAgICBdLAorCisgICAgICAgICMgZG91YmxlLXF1b3RlZCBzY2FsYXJzCisgICAgICAgICdkb3VibGUtcXVvdGVkLXNjYWxhcic6IFsKKyAgICAgICAgICAgICMgaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBsaW5lIGJyZWFrIHJ1bGVzCisgICAgICAgICAgICBpbmNsdWRlKCdxdW90ZWQtc2NhbGFyLXdoaXRlc3BhY2VzJyksCisgICAgICAgICAgICAjIGVzY2FwaW5nIG9mIHNwZWNpYWwgY2hhcmFjdGVycworICAgICAgICAgICAgKHInXFxbMGFidFx0blxudmZyZSAiXFxOX0xQXScsIExpdGVyYWwuU2NhbGFyLkZsb3cuRXNjYXBlKSwKKyAgICAgICAgICAgICMgZXNjYXBlIGNvZGVzCisgICAgICAgICAgICAocidcXCg/OnhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NH18VVswLTlBLUZhLWZdezh9KScsCisgICAgICAgICAgICAgICAgTGl0ZXJhbC5TY2FsYXIuRmxvdy5Fc2NhcGUpLAorICAgICAgICAgICAgIyByZWd1bGFyIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIChyJ1teIFx0XG5cclxmXHZcIlxcXSsnLCBMaXRlcmFsLlNjYWxhci5GbG93KSwKKyAgICAgICAgICAgICMgdGhlIGNsb3NpbmcgcXVvdGUKKyAgICAgICAgICAgIChyJyInLCBMaXRlcmFsLlNjYWxhci5GbG93LlF1b3RlLCAnI3BvcCcpLAorICAgICAgICBdLAorCisgICAgICAgICMgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBsaW5lIHdoaWxlIHNjYW5uaW5nIGEgcGxhaW4gc2NhbGFyCisgICAgICAgICdwbGFpbi1zY2FsYXItaW4tYmxvY2stY29udGV4dC1uZXctbGluZSc6IFsKKyAgICAgICAgICAgICMgZW1wdHkgbGluZXMKKyAgICAgICAgICAgIChyJ15bIF0rJCcsIFRleHQuQmxhbmspLAorICAgICAgICAgICAgIyBsaW5lIGJyZWFrcworICAgICAgICAgICAgKHInXG4rJywgVGV4dC5CcmVhayksCisgICAgICAgICAgICAjIGRvY3VtZW50IHN0YXJ0IGFuZCBkb2N1bWVudCBlbmQgaW5kaWNhdG9ycworICAgICAgICAgICAgKHInXig/PS0tLXxcLlwuXC4pJywgc29tZXRoaW5nKFB1bmN0dWF0aW9uLkRvY3VtZW50KSwgJyNwb3A6MycpLAorICAgICAgICAgICAgIyBpbmRlbnRhdGlvbiBzcGFjZXMgKHdlIG1heSBsZWF2ZSB0aGUgYmxvY2sgbGluZSBzdGF0ZSBoZXJlKQorICAgICAgICAgICAgKHInXlsgXSonLCBwYXJzZV9wbGFpbl9zY2FsYXJfaW5kZW50KFRleHQuSW5kZW50KSwgJyNwb3AnKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGEgcGxhaW4gc2NhbGFyIGluIHRoZSBibG9jayBjb250ZXh0CisgICAgICAgICdwbGFpbi1zY2FsYXItaW4tYmxvY2stY29udGV4dCc6IFsKKyAgICAgICAgICAgICMgdGhlIHNjYWxhciBlbmRzIHdpdGggdGhlICc6JyBpbmRpY2F0b3IKKyAgICAgICAgICAgIChyJ1sgXSooPz06WyBdfDokKScsIHNvbWV0aGluZyhUZXh0LkJsYW5rKSwgJyNwb3AnKSwKKyAgICAgICAgICAgICMgdGhlIHNjYWxhciBlbmRzIHdpdGggd2hpdGVzcGFjZXMgZm9sbG93ZWQgYnkgYSBjb21tZW50CisgICAgICAgICAgICAocidbIF0rKD89IyknLCBUZXh0LkJsYW5rLCAnI3BvcCcpLAorICAgICAgICAgICAgIyB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhcmUgaWdub3JlZAorICAgICAgICAgICAgKHInWyBdKyQnLCBUZXh0LkJsYW5rKSwKKyAgICAgICAgICAgICMgbGluZSBicmVha3MgYXJlIGlnbm9yZWQKKyAgICAgICAgICAgIChyJ1xuKycsIFRleHQuQnJlYWssICdwbGFpbi1zY2FsYXItaW4tYmxvY2stY29udGV4dC1uZXctbGluZScpLAorICAgICAgICAgICAgIyBvdGhlciB3aGl0ZXNwYWNlcyBhcmUgYSBwYXJ0IG9mIHRoZSB2YWx1ZQorICAgICAgICAgICAgKHInWyBdKycsIExpdGVyYWwuU2NhbGFyLlBsYWluKSwKKyAgICAgICAgICAgICMgcmVndWxhciBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAocicoPzo6KD8hWyBcdFxuXHJcZlx2XSl8W14gXHRcblxyXGZcdjpdKSsnLAorICAgICAgICAgICAgICAgIExpdGVyYWwuU2NhbGFyLlBsYWluKSwKKyAgICAgICAgXSwKKworICAgICAgICAjIGEgcGxhaW4gc2NhbGFyIGlzIHRoZSBmbG93IGNvbnRleHQKKyAgICAgICAgJ3BsYWluLXNjYWxhci1pbi1mbG93LWNvbnRleHQnOiBbCisgICAgICAgICAgICAjIHRoZSBzY2FsYXIgZW5kcyB3aXRoIGFuIGluZGljYXRvciBjaGFyYWN0ZXIKKyAgICAgICAgICAgIChyJ1sgXSooPz1bLDo/XFtcXXt9XSknLCBzb21ldGhpbmcoVGV4dC5CbGFuayksICcjcG9wJyksCisgICAgICAgICAgICAjIHRoZSBzY2FsYXIgZW5kcyB3aXRoIGEgY29tbWVudAorICAgICAgICAgICAgKHInWyBdKyg/PSMpJywgVGV4dC5CbGFuaywgJyNwb3AnKSwKKyAgICAgICAgICAgICMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYXJlIGlnbm9yZWQKKyAgICAgICAgICAgIChyJ15bIF0rfFsgXSskJywgVGV4dC5CbGFuayksCisgICAgICAgICAgICAjIGxpbmUgYnJlYWtzIGFyZSBpZ25vcmVkCisgICAgICAgICAgICAocidcbisnLCBUZXh0LkJyZWFrKSwKKyAgICAgICAgICAgICMgb3RoZXIgd2hpdGVzcGFjZXMgYXJlIGEgcGFydCBvZiB0aGUgdmFsdWUKKyAgICAgICAgICAgIChyJ1sgXSsnLCBMaXRlcmFsLlNjYWxhci5QbGFpbiksCisgICAgICAgICAgICAjIHJlZ3VsYXIgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycworICAgICAgICAgICAgKHInW14gXHRcblxyXGZcdiw6P1xbXF17fV0rJywgTGl0ZXJhbC5TY2FsYXIuUGxhaW4pLAorICAgICAgICBdLAorCisgICAgfQorCisgICAgZGVmIGdldF90b2tlbnNfdW5wcm9jZXNzZWQoc2VsZiwgdGV4dD1Ob25lLCBjb250ZXh0PU5vbmUpOgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gWUFNTExleGVyQ29udGV4dCh0ZXh0LCAwKQorICAgICAgICByZXR1cm4gc3VwZXIoWUFNTExleGVyLCBzZWxmKS5nZXRfdG9rZW5zX3VucHJvY2Vzc2VkKHRleHQsIGNvbnRleHQpCisKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMveWFtbC1oaWdobGlnaHQveWFtbF9obC5jZmcgYi9leGFtcGxlcy95YW1sLWhpZ2hsaWdodC95YW1sX2hsLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJiODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMveWFtbC1oaWdobGlnaHQveWFtbF9obC5jZmcKQEAgLTAsMCArMSwxMTUgQEAKKyVZQU1MIDEuMQorLS0tCisKK2FzY2lpOgorCisgICAgaGVhZGVyOiAiXGVbMDsxOzMwOzQwbSIKKworICAgIGZvb3RlcjogIlxlWzBtIgorCisgICAgdG9rZW5zOgorICAgICAgICBzdHJlYW0tc3RhcnQ6CisgICAgICAgIHN0cmVhbS1lbmQ6CisgICAgICAgIGRpcmVjdGl2ZTogICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszNW0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGRvY3VtZW50LXN0YXJ0OiAgICAgICAgIHsgc3RhcnQ6ICJcZVszNW0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGRvY3VtZW50LWVuZDogICAgICAgICAgIHsgc3RhcnQ6ICJcZVszNW0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGJsb2NrLXNlcXVlbmNlLXN0YXJ0OgorICAgICAgICBibG9jay1tYXBwaW5nLXN0YXJ0OgorICAgICAgICBibG9jay1lbmQ6CisgICAgICAgIGZsb3ctc2VxdWVuY2Utc3RhcnQ6ICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGZsb3ctbWFwcGluZy1zdGFydDogICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGZsb3ctc2VxdWVuY2UtZW5kOiAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGZsb3ctbWFwcGluZy1lbmQ6ICAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGtleTogICAgICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIHZhbHVlOiAgICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGJsb2NrLWVudHJ5OiAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGZsb3ctZW50cnk6ICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszM20iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGFsaWFzOiAgICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszMm0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIGFuY2hvcjogICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszMm0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIHRhZzogICAgICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszMm0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisgICAgICAgIHNjYWxhcjogICAgICAgICAgICAgICAgIHsgc3RhcnQ6ICJcZVszNm0iLCBlbmQ6ICJcZVswOzE7MzA7NDBtIiB9CisKKyAgICByZXBsYWNlczoKKyAgICAgICAgLSAiXHJcbiI6ICAgIlxuIgorICAgICAgICAtICJcciI6ICAgICAiXG4iCisgICAgICAgIC0gIlxuIjogICAgICJcbiIKKyAgICAgICAgLSAiXHg4NSI6ICAgIlxuIgorICAgICAgICAtICJcdTIwMjgiOiAiXG4iCisgICAgICAgIC0gIlx1MjAyOSI6ICJcbiIKKworaHRtbDogJmh0bWwKKworICAgIHRva2VuczoKKyAgICAgICAgc3RyZWFtLXN0YXJ0OgorICAgICAgICBzdHJlYW0tZW5kOgorICAgICAgICBkaXJlY3RpdmU6ICAgICAgICAgICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisgICAgICAgIGRvY3VtZW50LXN0YXJ0OiAgICAgICAgIHsgc3RhcnQ6IDxjb2RlIGNsYXNzPSJkb2N1bWVudF9zdGFydF90b2tlbiI+LCBlbmQ6IDwvY29kZT4gfQorICAgICAgICBkb2N1bWVudC1lbmQ6ICAgICAgICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0iZG9jdW1lbnRfZW5kX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisgICAgICAgIGJsb2NrLXNlcXVlbmNlLXN0YXJ0OgorICAgICAgICBibG9jay1tYXBwaW5nLXN0YXJ0OgorICAgICAgICBibG9jay1lbmQ6CisgICAgICAgIGZsb3ctc2VxdWVuY2Utc3RhcnQ6ICAgIHsgc3RhcnQ6IDxjb2RlIGNsYXNzPSJkZWxpbWl0ZXJfdG9rZW4iPiwgZW5kOiA8L2NvZGU+IH0KKyAgICAgICAgZmxvdy1tYXBwaW5nLXN0YXJ0OiAgICAgeyBzdGFydDogPGNvZGUgY2xhc3M9ImRlbGltaXRlcl90b2tlbiI+LCBlbmQ6IDwvY29kZT4gfQorICAgICAgICBmbG93LXNlcXVlbmNlLWVuZDogICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0iZGVsaW1pdGVyX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisgICAgICAgIGZsb3ctbWFwcGluZy1lbmQ6ICAgICAgIHsgc3RhcnQ6IDxjb2RlIGNsYXNzPSJkZWxpbWl0ZXJfdG9rZW4iPiwgZW5kOiA8L2NvZGU+IH0KKyAgICAgICAga2V5OiAgICAgICAgICAgICAgICAgICAgeyBzdGFydDogPGNvZGUgY2xhc3M9ImRlbGltaXRlcl90b2tlbiI+LCBlbmQ6IDwvY29kZT4gfQorICAgICAgICB2YWx1ZTogICAgICAgICAgICAgICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0iZGVsaW1pdGVyX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisgICAgICAgIGJsb2NrLWVudHJ5OiAgICAgICAgICAgIHsgc3RhcnQ6IDxjb2RlIGNsYXNzPSJkZWxpbWl0ZXJfdG9rZW4iPiwgZW5kOiA8L2NvZGU+IH0KKyAgICAgICAgZmxvdy1lbnRyeTogICAgICAgICAgICAgeyBzdGFydDogPGNvZGUgY2xhc3M9ImRlbGltaXRlcl90b2tlbiI+LCBlbmQ6IDwvY29kZT4gfQorICAgICAgICBhbGlhczogICAgICAgICAgICAgICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0iYW5jaG9yX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisgICAgICAgIGFuY2hvcjogICAgICAgICAgICAgICAgIHsgc3RhcnQ6IDxjb2RlIGNsYXNzPSJhbmNob3JfdG9rZW4iPiwgZW5kOiA8L2NvZGU+IH0KKyAgICAgICAgdGFnOiAgICAgICAgICAgICAgICAgICAgeyBzdGFydDogPGNvZGUgY2xhc3M9InRhZ190b2tlbiI+LCBlbmQ6IDwvY29kZT4gfQorICAgICAgICBzY2FsYXI6ICAgICAgICAgICAgICAgICB7IHN0YXJ0OiA8Y29kZSBjbGFzcz0ic2NhbGFyX3Rva2VuIj4sIGVuZDogPC9jb2RlPiB9CisKKyAgICBldmVudHM6CisgICAgICAgIHN0cmVhbS1zdGFydDogICB7IHN0YXJ0OiA8cHJlIGNsYXNzPSJ5YW1sX3N0cmVhbSI+IH0KKyAgICAgICAgc3RyZWFtLWVuZDogICAgIHsgZW5kOiA8L3ByZT4gfQorICAgICAgICBkb2N1bWVudC1zdGFydDogeyBzdGFydDogPHNwYW4gY2xhc3M9ImRvY3VtZW50Ij4gfQorICAgICAgICBkb2N1bWVudC1lbmQ6ICAgeyBlbmQ6IDwvc3Bhbj4gfQorICAgICAgICBzZXF1ZW5jZS1zdGFydDogeyBzdGFydDogPHNwYW4gY2xhc3M9InNlcXVlbmNlIj4gfQorICAgICAgICBzZXF1ZW5jZS1lbmQ6ICAgeyBlbmQ6IDwvc3Bhbj4gfQorICAgICAgICBtYXBwaW5nLXN0YXJ0OiAgeyBzdGFydDogPHNwYW4gY2xhc3M9Im1hcHBpbmciPiB9CisgICAgICAgIG1hcHBpbmctZW5kOiAgICB7IGVuZDogPC9zcGFuPiB9CisgICAgICAgIHNjYWxhcjogICAgICAgICB7IHN0YXJ0OiA8c3BhbiBjbGFzcz0ic2NhbGFyIj4sIGVuZDogPC9zcGFuPiB9CisKKyAgICByZXBsYWNlczoKKyAgICAgICAgLSAiXHJcbiI6ICAgIlxuIgorICAgICAgICAtICJcciI6ICAgICAiXG4iCisgICAgICAgIC0gIlxuIjogICAgICJcbiIKKyAgICAgICAgLSAiXHg4NSI6ICAgIlxuIgorICAgICAgICAtICJcdTIwMjgiOiAiXG4iCisgICAgICAgIC0gIlx1MjAyOSI6ICJcbiIKKyAgICAgICAgLSAiJiI6ICAgICAgIiZhbXA7IgorICAgICAgICAtICI8IjogICAgICAiJmx0OyIKKyAgICAgICAgLSAiPiI6ICAgICAgIiZndDsiCisKK2h0bWwtcGFnZToKKworICAgIGhlYWRlcjogfAorICAgICAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5BIFlBTUwgc3RyZWFtPC90aXRsZT4KKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgIC5kb2N1bWVudCB7IGJhY2tncm91bmQ6ICNGRkYgfQorICAgICAgICAgICAgLnNlcXVlbmNlIHsgYmFja2dyb3VuZDogI0VFRiB9CisgICAgICAgICAgICAubWFwcGluZyB7IGJhY2tncm91bmQ6ICNFRkUgfQorICAgICAgICAgICAgLnNjYWxhciB7IGJhY2tncm91bmQ6ICNGRUUgfQorICAgICAgICAgICAgLmRpcmVjdGl2ZV90b2tlbiB7IGNvbG9yOiAjQzBDIH0KKyAgICAgICAgICAgIC5kb2N1bWVudF9zdGFydF90b2tlbiB7IGNvbG9yOiAjQzBDOyBmb250LXdlaWdodDogYm9sZCB9CisgICAgICAgICAgICAuZG9jdW1lbnRfZW5kX3Rva2VuIHsgY29sb3I6ICNDMEM7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKyAgICAgICAgICAgIC5kZWxpbWl0ZXJfdG9rZW4geyBjb2xvcjogIzYwMDsgZm9udC13ZWlnaHQ6IGJvbGQgfQorICAgICAgICAgICAgLmFuY2hvcl90b2tlbiB7IGNvbG9yOiAjMDkwIH0KKyAgICAgICAgICAgIC50YWdfdG9rZW4geyBjb2xvcjogIzA5MCB9CisgICAgICAgICAgICAuc2NhbGFyX3Rva2VuIHsgY29sb3I6ICMwMDAgfQorICAgICAgICAgICAgLnlhbWxfc3RyZWFtIHsgY29sb3I6ICM5OTkgfQorICAgICAgICA8L3N0eWxlPgorICAgICAgICA8Ym9keT4KKworICAgIGZvb3RlcjogfAorICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKworICAgIDw8OiAqaHRtbAorCisKKyMgdmltOiBmdD15YW1sCmRpZmYgLS1naXQgYS9leGFtcGxlcy95YW1sLWhpZ2hsaWdodC95YW1sX2hsLnB5IGIvZXhhbXBsZXMveWFtbC1oaWdobGlnaHQveWFtbF9obC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmY3YmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMveWFtbC1oaWdobGlnaHQveWFtbF9obC5weQpAQCAtMCwwICsxLDExNCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IHlhbWwsIGNvZGVjcywgc3lzLCBvcy5wYXRoLCBvcHRwYXJzZQorCitjbGFzcyBTdHlsZToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXI9Tm9uZSwgZm9vdGVyPU5vbmUsCisgICAgICAgICAgICB0b2tlbnM9Tm9uZSwgZXZlbnRzPU5vbmUsIHJlcGxhY2VzPU5vbmUpOgorICAgICAgICBzZWxmLmhlYWRlciA9IGhlYWRlcgorICAgICAgICBzZWxmLmZvb3RlciA9IGZvb3RlcgorICAgICAgICBzZWxmLnJlcGxhY2VzID0gcmVwbGFjZXMKKyAgICAgICAgc2VsZi5zdWJzdGl0dXRpb25zID0ge30KKyAgICAgICAgZm9yIGRvbWFpbiwgQ2xhc3MgaW4gWyh0b2tlbnMsICdUb2tlbicpLCAoZXZlbnRzLCAnRXZlbnQnKV06CisgICAgICAgICAgICBpZiBub3QgZG9tYWluOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3Iga2V5IGluIGRvbWFpbjoKKyAgICAgICAgICAgICAgICBuYW1lID0gJycuam9pbihbcGFydC5jYXBpdGFsaXplKCkgZm9yIHBhcnQgaW4ga2V5LnNwbGl0KCctJyldKQorICAgICAgICAgICAgICAgIGNscyA9IGdldGF0dHIoeWFtbCwgJyVzJXMnICUgKG5hbWUsIENsYXNzKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvbWFpbltrZXldCisgICAgICAgICAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gdmFsdWUuZ2V0KCdzdGFydCcpCisgICAgICAgICAgICAgICAgZW5kID0gdmFsdWUuZ2V0KCdlbmQnKQorICAgICAgICAgICAgICAgIGlmIHN0YXJ0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN1YnN0aXR1dGlvbnNbY2xzLCAtMV0gPSBzdGFydAorICAgICAgICAgICAgICAgIGlmIGVuZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWJzdGl0dXRpb25zW2NscywgKzFdID0gZW5kCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5fX2luaXRfXygqKnN0YXRlKQorCit5YW1sLmFkZF9wYXRoX3Jlc29sdmVyKHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdDpfX21haW5fXy5TdHlsZScsCisgICAgICAgIFtOb25lXSwgZGljdCkKK3lhbWwuYWRkX3BhdGhfcmVzb2x2ZXIodSd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsCisgICAgICAgIFtOb25lLCB1J3JlcGxhY2VzJ10sIGxpc3QpCisKK2NsYXNzIFlBTUxIaWdobGlnaHQ6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CisgICAgICAgIGNvbmZpZyA9IHlhbWwubG9hZChmaWxlKG9wdGlvbnMuY29uZmlnLCAncmInKS5yZWFkKCkpCisgICAgICAgIHNlbGYuc3R5bGUgPSBjb25maWdbb3B0aW9ucy5zdHlsZV0KKyAgICAgICAgaWYgb3B0aW9ucy5pbnB1dDoKKyAgICAgICAgICAgIHNlbGYuaW5wdXQgPSBmaWxlKG9wdGlvbnMuaW5wdXQsICdyYicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmlucHV0ID0gc3lzLnN0ZGluCisgICAgICAgIGlmIG9wdGlvbnMub3V0cHV0OgorICAgICAgICAgICAgc2VsZi5vdXRwdXQgPSBmaWxlKG9wdGlvbnMub3V0cHV0LCAnd2InKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQgPSBzeXMuc3Rkb3V0CisKKyAgICBkZWYgaGlnaGxpZ2h0KHNlbGYpOgorICAgICAgICBpbnB1dCA9IHNlbGYuaW5wdXQucmVhZCgpCisgICAgICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoY29kZWNzLkJPTV9VVEYxNl9MRSk6CisgICAgICAgICAgICBpbnB1dCA9IHVuaWNvZGUoaW5wdXQsICd1dGYtMTYtbGUnKQorICAgICAgICBlbGlmIGlucHV0LnN0YXJ0c3dpdGgoY29kZWNzLkJPTV9VVEYxNl9CRSk6CisgICAgICAgICAgICBpbnB1dCA9IHVuaWNvZGUoaW5wdXQsICd1dGYtMTYtYmUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5wdXQgPSB1bmljb2RlKGlucHV0LCAndXRmLTgnKQorICAgICAgICBzdWJzdGl0dXRpb25zID0gc2VsZi5zdHlsZS5zdWJzdGl0dXRpb25zCisgICAgICAgIHRva2VucyA9IHlhbWwuc2NhbihpbnB1dCkKKyAgICAgICAgZXZlbnRzID0geWFtbC5wYXJzZShpbnB1dCkKKyAgICAgICAgbWFya2VycyA9IFtdCisgICAgICAgIG51bWJlciA9IDAKKyAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgICAgIG51bWJlciArPSAxCisgICAgICAgICAgICBpZiB0b2tlbi5zdGFydF9tYXJrLmluZGV4ICE9IHRva2VuLmVuZF9tYXJrLmluZGV4OgorICAgICAgICAgICAgICAgIGNscyA9IHRva2VuLl9fY2xhc3NfXworICAgICAgICAgICAgICAgIGlmIChjbHMsIC0xKSBpbiBzdWJzdGl0dXRpb25zOgorICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLmFwcGVuZChbdG9rZW4uc3RhcnRfbWFyay5pbmRleCwgKzIsIG51bWJlciwgc3Vic3RpdHV0aW9uc1tjbHMsIC0xXV0pCisgICAgICAgICAgICAgICAgaWYgKGNscywgKzEpIGluIHN1YnN0aXR1dGlvbnM6CisgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMuYXBwZW5kKFt0b2tlbi5lbmRfbWFyay5pbmRleCwgLTIsIG51bWJlciwgc3Vic3RpdHV0aW9uc1tjbHMsICsxXV0pCisgICAgICAgIG51bWJlciA9IDAKKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIG51bWJlciArPSAxCisgICAgICAgICAgICBjbHMgPSBldmVudC5fX2NsYXNzX18KKyAgICAgICAgICAgIGlmIChjbHMsIC0xKSBpbiBzdWJzdGl0dXRpb25zOgorICAgICAgICAgICAgICAgIG1hcmtlcnMuYXBwZW5kKFtldmVudC5zdGFydF9tYXJrLmluZGV4LCArMSwgbnVtYmVyLCBzdWJzdGl0dXRpb25zW2NscywgLTFdXSkKKyAgICAgICAgICAgIGlmIChjbHMsICsxKSBpbiBzdWJzdGl0dXRpb25zOgorICAgICAgICAgICAgICAgIG1hcmtlcnMuYXBwZW5kKFtldmVudC5lbmRfbWFyay5pbmRleCwgLTEsIG51bWJlciwgc3Vic3RpdHV0aW9uc1tjbHMsICsxXV0pCisgICAgICAgIG1hcmtlcnMuc29ydCgpCisgICAgICAgIG1hcmtlcnMucmV2ZXJzZSgpCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHBvc2l0aW9uID0gbGVuKGlucHV0KQorICAgICAgICBmb3IgaW5kZXgsIHdlaWdodDEsIHdlaWdodDIsIHN1YnN0aXR1dGlvbiBpbiBtYXJrZXJzOgorICAgICAgICAgICAgaWYgaW5kZXggPCBwb3NpdGlvbjoKKyAgICAgICAgICAgICAgICBjaHVuayA9IGlucHV0W2luZGV4OnBvc2l0aW9uXQorICAgICAgICAgICAgICAgIGZvciBzdWJzdHJpbmcsIHJlcGxhY2VtZW50IGluIHNlbGYuc3R5bGUucmVwbGFjZXM6CisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsucmVwbGFjZShzdWJzdHJpbmcsIHJlcGxhY2VtZW50KQorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpbmRleAorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzdWJzdGl0dXRpb24pCisgICAgICAgIGNodW5rcy5yZXZlcnNlKCkKKyAgICAgICAgcmVzdWx0ID0gdScnLmpvaW4oY2h1bmtzKQorICAgICAgICBpZiBzZWxmLnN0eWxlLmhlYWRlcjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKHNlbGYuc3R5bGUuaGVhZGVyKQorICAgICAgICBzZWxmLm91dHB1dC53cml0ZShyZXN1bHQuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBpZiBzZWxmLnN0eWxlLmZvb3RlcjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKHNlbGYuc3R5bGUuZm9vdGVyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc3R5bGUnLCBkZXN0PSdzdHlsZScsIGRlZmF1bHQ9J2FzY2lpJywKKyAgICAgICAgICAgIGhlbHA9InNwZWNpZnkgdGhlIGhpZ2hsaWdodGluZyBzdHlsZSIsIG1ldGF2YXI9J1NUWUxFJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLWMnLCAnLS1jb25maWcnLCBkZXN0PSdjb25maWcnLAorICAgICAgICAgICAgZGVmYXVsdD1vcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJ3lhbWxfaGwuY2ZnJyksCisgICAgICAgICAgICBoZWxwPSJzZXQgYW4gYWx0ZXJuYXRpdmUgY29uZmlndXJhdGlvbiBmaWxlIiwgbWV0YXZhcj0nQ09ORklHJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLWknLCAnLS1pbnB1dCcsIGRlc3Q9J2lucHV0JywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgaGVscD0ic2V0IHRoZSBpbnB1dCBmaWxlIChkZWZhdWx0OiBzdGRpbikiLCBtZXRhdmFyPSdGSUxFJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLW8nLCAnLS1vdXRwdXQnLCBkZXN0PSdvdXRwdXQnLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICBoZWxwPSJzZXQgdGhlIG91dHB1dCBmaWxlIChkZWZhdWx0OiBzdGRvdXQpIiwgbWV0YXZhcj0nRklMRScpCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIGhsID0gWUFNTEhpZ2hsaWdodChvcHRpb25zKQorICAgIGhsLmhpZ2hsaWdodCgpCisKZGlmZiAtLWdpdCBhL2V4dC9feWFtbC5oIGIvZXh0L195YW1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmZDZhOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9feWFtbC5oCkBAIC0wLDAgKzEsMjMgQEAKKworI2luY2x1ZGUgPHlhbWwuaD4KKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisKKyNkZWZpbmUgUHlVbmljb2RlX0Zyb21TdHJpbmcocykgUHlVbmljb2RlX0RlY29kZVVURjgoKHMpLCBzdHJsZW4ocyksICJzdHJpY3QiKQorCisjZWxzZQorCisjZGVmaW5lIFB5U3RyaW5nX0NoZWNrRXhhY3QgUHlCeXRlc19DaGVja0V4YWN0CisjZGVmaW5lIFB5U3RyaW5nX0FTX1NUUklORyAgUHlCeXRlc19BU19TVFJJTkcKKyNkZWZpbmUgUHlTdHJpbmdfR0VUX1NJWkUgICBQeUJ5dGVzX0dFVF9TSVpFCisjZGVmaW5lIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCisKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIJLyogTVMgVmlzdWFsIEMrKyA2LjAgKi8KKyNpZiBfTVNDX1ZFUiA9PSAxMjAwCisKKyNkZWZpbmUgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHopCVB5SW50X0Zyb21Mb25nKGkpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9leHQvX3lhbWwucHhkIGIvZXh0L195YW1sLnB4ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDdmNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L195YW1sLnB4ZApAQCAtMCwwICsxLDI1MSBAQAorCitjZGVmIGV4dGVybiBmcm9tICJfeWFtbC5oIjoKKworICAgIHZvaWQgbWFsbG9jKGludCBsKQorICAgIHZvaWQgbWVtY3B5KGNoYXIgKmQsIGNoYXIgKnMsIGludCBsKQorICAgIGludCBzdHJsZW4oY2hhciAqcykKKyAgICBpbnQgUHlTdHJpbmdfQ2hlY2tFeGFjdChvYmplY3QgbykKKyAgICBpbnQgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqZWN0IG8pCisgICAgY2hhciAqUHlTdHJpbmdfQVNfU1RSSU5HKG9iamVjdCBvKQorICAgIGludCBQeVN0cmluZ19HRVRfU0laRShvYmplY3QgbykKKyAgICBvYmplY3QgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2hhciAqdiwgaW50IGwpCisgICAgb2JqZWN0IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGNoYXIgKnUpCisgICAgb2JqZWN0IFB5VW5pY29kZV9EZWNvZGVVVEY4KGNoYXIgKnUsIGludCBzLCBjaGFyICplKQorICAgIG9iamVjdCBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG9iamVjdCBvKQorICAgIGludCBQWV9NQUpPUl9WRVJTSU9OCisKKyAgICBjdHlwZWRlZiBlbnVtOgorICAgICAgICBTSVpFT0ZfVk9JRF9QCisgICAgY3R5cGVkZWYgZW51bSB5YW1sX2VuY29kaW5nX3Q6CisgICAgICAgIFlBTUxfQU5ZX0VOQ09ESU5HCisgICAgICAgIFlBTUxfVVRGOF9FTkNPRElORworICAgICAgICBZQU1MX1VURjE2TEVfRU5DT0RJTkcKKyAgICAgICAgWUFNTF9VVEYxNkJFX0VOQ09ESU5HCisgICAgY3R5cGVkZWYgZW51bSB5YW1sX2JyZWFrX3Q6CisgICAgICAgIFlBTUxfQU5ZX0JSRUFLCisgICAgICAgIFlBTUxfQ1JfQlJFQUsKKyAgICAgICAgWUFNTF9MTl9CUkVBSworICAgICAgICBZQU1MX0NSTE5fQlJFQUsKKyAgICBjdHlwZWRlZiBlbnVtIHlhbWxfZXJyb3JfdHlwZV90OgorICAgICAgICBZQU1MX05PX0VSUk9SCisgICAgICAgIFlBTUxfTUVNT1JZX0VSUk9SCisgICAgICAgIFlBTUxfUkVBREVSX0VSUk9SCisgICAgICAgIFlBTUxfU0NBTk5FUl9FUlJPUgorICAgICAgICBZQU1MX1BBUlNFUl9FUlJPUgorICAgICAgICBZQU1MX1dSSVRFUl9FUlJPUgorICAgICAgICBZQU1MX0VNSVRURVJfRVJST1IKKyAgICBjdHlwZWRlZiBlbnVtIHlhbWxfc2NhbGFyX3N0eWxlX3Q6CisgICAgICAgIFlBTUxfQU5ZX1NDQUxBUl9TVFlMRQorICAgICAgICBZQU1MX1BMQUlOX1NDQUxBUl9TVFlMRQorICAgICAgICBZQU1MX1NJTkdMRV9RVU9URURfU0NBTEFSX1NUWUxFCisgICAgICAgIFlBTUxfRE9VQkxFX1FVT1RFRF9TQ0FMQVJfU1RZTEUKKyAgICAgICAgWUFNTF9MSVRFUkFMX1NDQUxBUl9TVFlMRQorICAgICAgICBZQU1MX0ZPTERFRF9TQ0FMQVJfU1RZTEUKKyAgICBjdHlwZWRlZiBlbnVtIHlhbWxfc2VxdWVuY2Vfc3R5bGVfdDoKKyAgICAgICAgWUFNTF9BTllfU0VRVUVOQ0VfU1RZTEUKKyAgICAgICAgWUFNTF9CTE9DS19TRVFVRU5DRV9TVFlMRQorICAgICAgICBZQU1MX0ZMT1dfU0VRVUVOQ0VfU1RZTEUKKyAgICBjdHlwZWRlZiBlbnVtIHlhbWxfbWFwcGluZ19zdHlsZV90OgorICAgICAgICBZQU1MX0FOWV9NQVBQSU5HX1NUWUxFCisgICAgICAgIFlBTUxfQkxPQ0tfTUFQUElOR19TVFlMRQorICAgICAgICBZQU1MX0ZMT1dfTUFQUElOR19TVFlMRQorICAgIGN0eXBlZGVmIGVudW0geWFtbF90b2tlbl90eXBlX3Q6CisgICAgICAgIFlBTUxfTk9fVE9LRU4KKyAgICAgICAgWUFNTF9TVFJFQU1fU1RBUlRfVE9LRU4KKyAgICAgICAgWUFNTF9TVFJFQU1fRU5EX1RPS0VOCisgICAgICAgIFlBTUxfVkVSU0lPTl9ESVJFQ1RJVkVfVE9LRU4KKyAgICAgICAgWUFNTF9UQUdfRElSRUNUSVZFX1RPS0VOCisgICAgICAgIFlBTUxfRE9DVU1FTlRfU1RBUlRfVE9LRU4KKyAgICAgICAgWUFNTF9ET0NVTUVOVF9FTkRfVE9LRU4KKyAgICAgICAgWUFNTF9CTE9DS19TRVFVRU5DRV9TVEFSVF9UT0tFTgorICAgICAgICBZQU1MX0JMT0NLX01BUFBJTkdfU1RBUlRfVE9LRU4KKyAgICAgICAgWUFNTF9CTE9DS19FTkRfVE9LRU4KKyAgICAgICAgWUFNTF9GTE9XX1NFUVVFTkNFX1NUQVJUX1RPS0VOCisgICAgICAgIFlBTUxfRkxPV19TRVFVRU5DRV9FTkRfVE9LRU4KKyAgICAgICAgWUFNTF9GTE9XX01BUFBJTkdfU1RBUlRfVE9LRU4KKyAgICAgICAgWUFNTF9GTE9XX01BUFBJTkdfRU5EX1RPS0VOCisgICAgICAgIFlBTUxfQkxPQ0tfRU5UUllfVE9LRU4KKyAgICAgICAgWUFNTF9GTE9XX0VOVFJZX1RPS0VOCisgICAgICAgIFlBTUxfS0VZX1RPS0VOCisgICAgICAgIFlBTUxfVkFMVUVfVE9LRU4KKyAgICAgICAgWUFNTF9BTElBU19UT0tFTgorICAgICAgICBZQU1MX0FOQ0hPUl9UT0tFTgorICAgICAgICBZQU1MX1RBR19UT0tFTgorICAgICAgICBZQU1MX1NDQUxBUl9UT0tFTgorICAgIGN0eXBlZGVmIGVudW0geWFtbF9ldmVudF90eXBlX3Q6CisgICAgICAgIFlBTUxfTk9fRVZFTlQKKyAgICAgICAgWUFNTF9TVFJFQU1fU1RBUlRfRVZFTlQKKyAgICAgICAgWUFNTF9TVFJFQU1fRU5EX0VWRU5UCisgICAgICAgIFlBTUxfRE9DVU1FTlRfU1RBUlRfRVZFTlQKKyAgICAgICAgWUFNTF9ET0NVTUVOVF9FTkRfRVZFTlQKKyAgICAgICAgWUFNTF9BTElBU19FVkVOVAorICAgICAgICBZQU1MX1NDQUxBUl9FVkVOVAorICAgICAgICBZQU1MX1NFUVVFTkNFX1NUQVJUX0VWRU5UCisgICAgICAgIFlBTUxfU0VRVUVOQ0VfRU5EX0VWRU5UCisgICAgICAgIFlBTUxfTUFQUElOR19TVEFSVF9FVkVOVAorICAgICAgICBZQU1MX01BUFBJTkdfRU5EX0VWRU5UCisKKyAgICBjdHlwZWRlZiBpbnQgeWFtbF9yZWFkX2hhbmRsZXJfdCh2b2lkICpkYXRhLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICBpbnQgc2l6ZSwgaW50ICpzaXplX3JlYWQpIGV4Y2VwdCAwCisKKyAgICBjdHlwZWRlZiBpbnQgeWFtbF93cml0ZV9oYW5kbGVyX3Qodm9pZCAqZGF0YSwgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgaW50IHNpemUpIGV4Y2VwdCAwCisKKyAgICBjdHlwZWRlZiBzdHJ1Y3QgeWFtbF9tYXJrX3Q6CisgICAgICAgIGludCBpbmRleAorICAgICAgICBpbnQgbGluZQorICAgICAgICBpbnQgY29sdW1uCisgICAgY3R5cGVkZWYgc3RydWN0IHlhbWxfdmVyc2lvbl9kaXJlY3RpdmVfdDoKKyAgICAgICAgaW50IG1ham9yCisgICAgICAgIGludCBtaW5vcgorICAgIGN0eXBlZGVmIHN0cnVjdCB5YW1sX3RhZ19kaXJlY3RpdmVfdDoKKyAgICAgICAgY2hhciAqaGFuZGxlCisgICAgICAgIGNoYXIgKnByZWZpeAorCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX3Rva2VuX3N0cmVhbV9zdGFydF9kYXRhX3Q6CisgICAgICAgIHlhbWxfZW5jb2RpbmdfdCBlbmNvZGluZworICAgIGN0eXBlZGVmIHN0cnVjdCBfeWFtbF90b2tlbl9hbGlhc19kYXRhX3Q6CisgICAgICAgIGNoYXIgKnZhbHVlCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX3Rva2VuX2FuY2hvcl9kYXRhX3Q6CisgICAgICAgIGNoYXIgKnZhbHVlCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX3Rva2VuX3RhZ19kYXRhX3Q6CisgICAgICAgIGNoYXIgKmhhbmRsZQorICAgICAgICBjaGFyICpzdWZmaXgKKyAgICBjdHlwZWRlZiBzdHJ1Y3QgX3lhbWxfdG9rZW5fc2NhbGFyX2RhdGFfdDoKKyAgICAgICAgY2hhciAqdmFsdWUKKyAgICAgICAgaW50IGxlbmd0aAorICAgICAgICB5YW1sX3NjYWxhcl9zdHlsZV90IHN0eWxlCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX3Rva2VuX3ZlcnNpb25fZGlyZWN0aXZlX2RhdGFfdDoKKyAgICAgICAgaW50IG1ham9yCisgICAgICAgIGludCBtaW5vcgorICAgIGN0eXBlZGVmIHN0cnVjdCBfeWFtbF90b2tlbl90YWdfZGlyZWN0aXZlX2RhdGFfdDoKKyAgICAgICAgY2hhciAqaGFuZGxlCisgICAgICAgIGNoYXIgKnByZWZpeAorICAgIGN0eXBlZGVmIHVuaW9uIF95YW1sX3Rva2VuX2RhdGFfdDoKKyAgICAgICAgX3lhbWxfdG9rZW5fc3RyZWFtX3N0YXJ0X2RhdGFfdCBzdHJlYW1fc3RhcnQKKyAgICAgICAgX3lhbWxfdG9rZW5fYWxpYXNfZGF0YV90IGFsaWFzCisgICAgICAgIF95YW1sX3Rva2VuX2FuY2hvcl9kYXRhX3QgYW5jaG9yCisgICAgICAgIF95YW1sX3Rva2VuX3RhZ19kYXRhX3QgdGFnCisgICAgICAgIF95YW1sX3Rva2VuX3NjYWxhcl9kYXRhX3Qgc2NhbGFyCisgICAgICAgIF95YW1sX3Rva2VuX3ZlcnNpb25fZGlyZWN0aXZlX2RhdGFfdCB2ZXJzaW9uX2RpcmVjdGl2ZQorICAgICAgICBfeWFtbF90b2tlbl90YWdfZGlyZWN0aXZlX2RhdGFfdCB0YWdfZGlyZWN0aXZlCisgICAgY3R5cGVkZWYgc3RydWN0IHlhbWxfdG9rZW5fdDoKKyAgICAgICAgeWFtbF90b2tlbl90eXBlX3QgdHlwZQorICAgICAgICBfeWFtbF90b2tlbl9kYXRhX3QgZGF0YQorICAgICAgICB5YW1sX21hcmtfdCBzdGFydF9tYXJrCisgICAgICAgIHlhbWxfbWFya190IGVuZF9tYXJrCisKKyAgICBjdHlwZWRlZiBzdHJ1Y3QgX3lhbWxfZXZlbnRfc3RyZWFtX3N0YXJ0X2RhdGFfdDoKKyAgICAgICAgeWFtbF9lbmNvZGluZ190IGVuY29kaW5nCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX2V2ZW50X2RvY3VtZW50X3N0YXJ0X2RhdGFfdGFnX2RpcmVjdGl2ZXNfdDoKKyAgICAgICAgeWFtbF90YWdfZGlyZWN0aXZlX3QgKnN0YXJ0CisgICAgICAgIHlhbWxfdGFnX2RpcmVjdGl2ZV90ICplbmQKKyAgICBjdHlwZWRlZiBzdHJ1Y3QgX3lhbWxfZXZlbnRfZG9jdW1lbnRfc3RhcnRfZGF0YV90OgorICAgICAgICB5YW1sX3ZlcnNpb25fZGlyZWN0aXZlX3QgKnZlcnNpb25fZGlyZWN0aXZlCisgICAgICAgIF95YW1sX2V2ZW50X2RvY3VtZW50X3N0YXJ0X2RhdGFfdGFnX2RpcmVjdGl2ZXNfdCB0YWdfZGlyZWN0aXZlcworICAgICAgICBpbnQgaW1wbGljaXQKKyAgICBjdHlwZWRlZiBzdHJ1Y3QgX3lhbWxfZXZlbnRfZG9jdW1lbnRfZW5kX2RhdGFfdDoKKyAgICAgICAgaW50IGltcGxpY2l0CisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX2V2ZW50X2FsaWFzX2RhdGFfdDoKKyAgICAgICAgY2hhciAqYW5jaG9yCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX2V2ZW50X3NjYWxhcl9kYXRhX3Q6CisgICAgICAgIGNoYXIgKmFuY2hvcgorICAgICAgICBjaGFyICp0YWcKKyAgICAgICAgY2hhciAqdmFsdWUKKyAgICAgICAgaW50IGxlbmd0aAorICAgICAgICBpbnQgcGxhaW5faW1wbGljaXQKKyAgICAgICAgaW50IHF1b3RlZF9pbXBsaWNpdAorICAgICAgICB5YW1sX3NjYWxhcl9zdHlsZV90IHN0eWxlCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX2V2ZW50X3NlcXVlbmNlX3N0YXJ0X2RhdGFfdDoKKyAgICAgICAgY2hhciAqYW5jaG9yCisgICAgICAgIGNoYXIgKnRhZworICAgICAgICBpbnQgaW1wbGljaXQKKyAgICAgICAgeWFtbF9zZXF1ZW5jZV9zdHlsZV90IHN0eWxlCisgICAgY3R5cGVkZWYgc3RydWN0IF95YW1sX2V2ZW50X21hcHBpbmdfc3RhcnRfZGF0YV90OgorICAgICAgICBjaGFyICphbmNob3IKKyAgICAgICAgY2hhciAqdGFnCisgICAgICAgIGludCBpbXBsaWNpdAorICAgICAgICB5YW1sX21hcHBpbmdfc3R5bGVfdCBzdHlsZQorICAgIGN0eXBlZGVmIHVuaW9uIF95YW1sX2V2ZW50X2RhdGFfdDoKKyAgICAgICAgX3lhbWxfZXZlbnRfc3RyZWFtX3N0YXJ0X2RhdGFfdCBzdHJlYW1fc3RhcnQKKyAgICAgICAgX3lhbWxfZXZlbnRfZG9jdW1lbnRfc3RhcnRfZGF0YV90IGRvY3VtZW50X3N0YXJ0CisgICAgICAgIF95YW1sX2V2ZW50X2RvY3VtZW50X2VuZF9kYXRhX3QgZG9jdW1lbnRfZW5kCisgICAgICAgIF95YW1sX2V2ZW50X2FsaWFzX2RhdGFfdCBhbGlhcworICAgICAgICBfeWFtbF9ldmVudF9zY2FsYXJfZGF0YV90IHNjYWxhcgorICAgICAgICBfeWFtbF9ldmVudF9zZXF1ZW5jZV9zdGFydF9kYXRhX3Qgc2VxdWVuY2Vfc3RhcnQKKyAgICAgICAgX3lhbWxfZXZlbnRfbWFwcGluZ19zdGFydF9kYXRhX3QgbWFwcGluZ19zdGFydAorICAgIGN0eXBlZGVmIHN0cnVjdCB5YW1sX2V2ZW50X3Q6CisgICAgICAgIHlhbWxfZXZlbnRfdHlwZV90IHR5cGUKKyAgICAgICAgX3lhbWxfZXZlbnRfZGF0YV90IGRhdGEKKyAgICAgICAgeWFtbF9tYXJrX3Qgc3RhcnRfbWFyaworICAgICAgICB5YW1sX21hcmtfdCBlbmRfbWFyaworCisgICAgY3R5cGVkZWYgc3RydWN0IHlhbWxfcGFyc2VyX3Q6CisgICAgICAgIHlhbWxfZXJyb3JfdHlwZV90IGVycm9yCisgICAgICAgIGNoYXIgKnByb2JsZW0KKyAgICAgICAgaW50IHByb2JsZW1fb2Zmc2V0CisgICAgICAgIGludCBwcm9ibGVtX3ZhbHVlCisgICAgICAgIHlhbWxfbWFya190IHByb2JsZW1fbWFyaworICAgICAgICBjaGFyICpjb250ZXh0CisgICAgICAgIHlhbWxfbWFya190IGNvbnRleHRfbWFyaworCisgICAgY3R5cGVkZWYgc3RydWN0IHlhbWxfZW1pdHRlcl90OgorICAgICAgICB5YW1sX2Vycm9yX3R5cGVfdCBlcnJvcgorICAgICAgICBjaGFyICpwcm9ibGVtCisKKyAgICBjaGFyICp5YW1sX2dldF92ZXJzaW9uX3N0cmluZygpCisgICAgdm9pZCB5YW1sX2dldF92ZXJzaW9uKGludCAqbWFqb3IsIGludCAqbWlub3IsIGludCAqcGF0Y2gpCisKKyAgICB2b2lkIHlhbWxfdG9rZW5fZGVsZXRlKHlhbWxfdG9rZW5fdCAqdG9rZW4pCisKKyAgICBpbnQgeWFtbF9zdHJlYW1fc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZSh5YW1sX2V2ZW50X3QgKmV2ZW50LAorICAgICAgICAgICAgeWFtbF9lbmNvZGluZ190IGVuY29kaW5nKQorICAgIGludCB5YW1sX3N0cmVhbV9lbmRfZXZlbnRfaW5pdGlhbGl6ZSh5YW1sX2V2ZW50X3QgKmV2ZW50KQorICAgIGludCB5YW1sX2RvY3VtZW50X3N0YXJ0X2V2ZW50X2luaXRpYWxpemUoeWFtbF9ldmVudF90ICpldmVudCwKKyAgICAgICAgICAgIHlhbWxfdmVyc2lvbl9kaXJlY3RpdmVfdCAqdmVyc2lvbl9kaXJlY3RpdmUsCisgICAgICAgICAgICB5YW1sX3RhZ19kaXJlY3RpdmVfdCAqdGFnX2RpcmVjdGl2ZXNfc3RhcnQsCisgICAgICAgICAgICB5YW1sX3RhZ19kaXJlY3RpdmVfdCAqdGFnX2RpcmVjdGl2ZXNfZW5kLAorICAgICAgICAgICAgaW50IGltcGxpY2l0KQorICAgIGludCB5YW1sX2RvY3VtZW50X2VuZF9ldmVudF9pbml0aWFsaXplKHlhbWxfZXZlbnRfdCAqZXZlbnQsCisgICAgICAgICAgICBpbnQgaW1wbGljaXQpCisgICAgaW50IHlhbWxfYWxpYXNfZXZlbnRfaW5pdGlhbGl6ZSh5YW1sX2V2ZW50X3QgKmV2ZW50LCBjaGFyICphbmNob3IpCisgICAgaW50IHlhbWxfc2NhbGFyX2V2ZW50X2luaXRpYWxpemUoeWFtbF9ldmVudF90ICpldmVudCwKKyAgICAgICAgICAgIGNoYXIgKmFuY2hvciwgY2hhciAqdGFnLCBjaGFyICp2YWx1ZSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIGludCBwbGFpbl9pbXBsaWNpdCwgaW50IHF1b3RlZF9pbXBsaWNpdCwKKyAgICAgICAgICAgIHlhbWxfc2NhbGFyX3N0eWxlX3Qgc3R5bGUpCisgICAgaW50IHlhbWxfc2VxdWVuY2Vfc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZSh5YW1sX2V2ZW50X3QgKmV2ZW50LAorICAgICAgICAgICAgY2hhciAqYW5jaG9yLCBjaGFyICp0YWcsIGludCBpbXBsaWNpdCwgeWFtbF9zZXF1ZW5jZV9zdHlsZV90IHN0eWxlKQorICAgIGludCB5YW1sX3NlcXVlbmNlX2VuZF9ldmVudF9pbml0aWFsaXplKHlhbWxfZXZlbnRfdCAqZXZlbnQpCisgICAgaW50IHlhbWxfbWFwcGluZ19zdGFydF9ldmVudF9pbml0aWFsaXplKHlhbWxfZXZlbnRfdCAqZXZlbnQsCisgICAgICAgICAgICBjaGFyICphbmNob3IsIGNoYXIgKnRhZywgaW50IGltcGxpY2l0LCB5YW1sX21hcHBpbmdfc3R5bGVfdCBzdHlsZSkKKyAgICBpbnQgeWFtbF9tYXBwaW5nX2VuZF9ldmVudF9pbml0aWFsaXplKHlhbWxfZXZlbnRfdCAqZXZlbnQpCisgICAgdm9pZCB5YW1sX2V2ZW50X2RlbGV0ZSh5YW1sX2V2ZW50X3QgKmV2ZW50KQorCisgICAgaW50IHlhbWxfcGFyc2VyX2luaXRpYWxpemUoeWFtbF9wYXJzZXJfdCAqcGFyc2VyKQorICAgIHZvaWQgeWFtbF9wYXJzZXJfZGVsZXRlKHlhbWxfcGFyc2VyX3QgKnBhcnNlcikKKyAgICB2b2lkIHlhbWxfcGFyc2VyX3NldF9pbnB1dF9zdHJpbmcoeWFtbF9wYXJzZXJfdCAqcGFyc2VyLAorICAgICAgICAgICAgY2hhciAqaW5wdXQsIGludCBzaXplKQorICAgIHZvaWQgeWFtbF9wYXJzZXJfc2V0X2lucHV0KHlhbWxfcGFyc2VyX3QgKnBhcnNlciwKKyAgICAgICAgICAgIHlhbWxfcmVhZF9oYW5kbGVyX3QgKmhhbmRsZXIsIHZvaWQgKmRhdGEpCisgICAgdm9pZCB5YW1sX3BhcnNlcl9zZXRfZW5jb2RpbmcoeWFtbF9wYXJzZXJfdCAqcGFyc2VyLAorICAgICAgICAgICAgeWFtbF9lbmNvZGluZ190IGVuY29kaW5nKQorICAgIGludCB5YW1sX3BhcnNlcl9zY2FuKHlhbWxfcGFyc2VyX3QgKnBhcnNlciwgeWFtbF90b2tlbl90ICp0b2tlbikgZXhjZXB0ICoKKyAgICBpbnQgeWFtbF9wYXJzZXJfcGFyc2UoeWFtbF9wYXJzZXJfdCAqcGFyc2VyLCB5YW1sX2V2ZW50X3QgKmV2ZW50KSBleGNlcHQgKgorCisgICAgaW50IHlhbWxfZW1pdHRlcl9pbml0aWFsaXplKHlhbWxfZW1pdHRlcl90ICplbWl0dGVyKQorICAgIHZvaWQgeWFtbF9lbWl0dGVyX2RlbGV0ZSh5YW1sX2VtaXR0ZXJfdCAqZW1pdHRlcikKKyAgICB2b2lkIHlhbWxfZW1pdHRlcl9zZXRfb3V0cHV0X3N0cmluZyh5YW1sX2VtaXR0ZXJfdCAqZW1pdHRlciwKKyAgICAgICAgICAgIGNoYXIgKm91dHB1dCwgaW50IHNpemUsIGludCAqc2l6ZV93cml0dGVuKQorICAgIHZvaWQgeWFtbF9lbWl0dGVyX3NldF9vdXRwdXQoeWFtbF9lbWl0dGVyX3QgKmVtaXR0ZXIsCisgICAgICAgICAgICB5YW1sX3dyaXRlX2hhbmRsZXJfdCAqaGFuZGxlciwgdm9pZCAqZGF0YSkKKyAgICB2b2lkIHlhbWxfZW1pdHRlcl9zZXRfZW5jb2RpbmcoeWFtbF9lbWl0dGVyX3QgKmVtaXR0ZXIsCisgICAgICAgICAgICB5YW1sX2VuY29kaW5nX3QgZW5jb2RpbmcpCisgICAgdm9pZCB5YW1sX2VtaXR0ZXJfc2V0X2Nhbm9uaWNhbCh5YW1sX2VtaXR0ZXJfdCAqZW1pdHRlciwgaW50IGNhbm9uaWNhbCkKKyAgICB2b2lkIHlhbWxfZW1pdHRlcl9zZXRfaW5kZW50KHlhbWxfZW1pdHRlcl90ICplbWl0dGVyLCBpbnQgaW5kZW50KQorICAgIHZvaWQgeWFtbF9lbWl0dGVyX3NldF93aWR0aCh5YW1sX2VtaXR0ZXJfdCAqZW1pdHRlciwgaW50IHdpZHRoKQorICAgIHZvaWQgeWFtbF9lbWl0dGVyX3NldF91bmljb2RlKHlhbWxfZW1pdHRlcl90ICplbWl0dGVyLCBpbnQgdW5pY29kZSkKKyAgICB2b2lkIHlhbWxfZW1pdHRlcl9zZXRfYnJlYWsoeWFtbF9lbWl0dGVyX3QgKmVtaXR0ZXIsCisgICAgICAgICAgICB5YW1sX2JyZWFrX3QgbGluZV9icmVhaykKKyAgICBpbnQgeWFtbF9lbWl0dGVyX2VtaXQoeWFtbF9lbWl0dGVyX3QgKmVtaXR0ZXIsIHlhbWxfZXZlbnRfdCAqZXZlbnQpIGV4Y2VwdCAqCisgICAgaW50IHlhbWxfZW1pdHRlcl9mbHVzaCh5YW1sX2VtaXR0ZXJfdCAqZW1pdHRlcikKKwpkaWZmIC0tZ2l0IGEvZXh0L195YW1sLnB5eCBiL2V4dC9feWFtbC5weXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1OGZiNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9feWFtbC5weXgKQEAgLTAsMCArMSwxNTI3IEBACisKK2ltcG9ydCB5YW1sCisKK2RlZiBnZXRfdmVyc2lvbl9zdHJpbmcoKToKKyAgICBjZGVmIGNoYXIgKnZhbHVlCisgICAgdmFsdWUgPSB5YW1sX2dldF92ZXJzaW9uX3N0cmluZygpCisgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyh2YWx1ZSkKKworZGVmIGdldF92ZXJzaW9uKCk6CisgICAgY2RlZiBpbnQgbWFqb3IsIG1pbm9yLCBwYXRjaAorICAgIHlhbWxfZ2V0X3ZlcnNpb24oJm1ham9yLCAmbWlub3IsICZwYXRjaCkKKyAgICByZXR1cm4gKG1ham9yLCBtaW5vciwgcGF0Y2gpCisKKyNNYXJrID0geWFtbC5lcnJvci5NYXJrCitZQU1MRXJyb3IgPSB5YW1sLmVycm9yLllBTUxFcnJvcgorUmVhZGVyRXJyb3IgPSB5YW1sLnJlYWRlci5SZWFkZXJFcnJvcgorU2Nhbm5lckVycm9yID0geWFtbC5zY2FubmVyLlNjYW5uZXJFcnJvcgorUGFyc2VyRXJyb3IgPSB5YW1sLnBhcnNlci5QYXJzZXJFcnJvcgorQ29tcG9zZXJFcnJvciA9IHlhbWwuY29tcG9zZXIuQ29tcG9zZXJFcnJvcgorQ29uc3RydWN0b3JFcnJvciA9IHlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3JFcnJvcgorRW1pdHRlckVycm9yID0geWFtbC5lbWl0dGVyLkVtaXR0ZXJFcnJvcgorU2VyaWFsaXplckVycm9yID0geWFtbC5zZXJpYWxpemVyLlNlcmlhbGl6ZXJFcnJvcgorUmVwcmVzZW50ZXJFcnJvciA9IHlhbWwucmVwcmVzZW50ZXIuUmVwcmVzZW50ZXJFcnJvcgorCitTdHJlYW1TdGFydFRva2VuID0geWFtbC50b2tlbnMuU3RyZWFtU3RhcnRUb2tlbgorU3RyZWFtRW5kVG9rZW4gPSB5YW1sLnRva2Vucy5TdHJlYW1FbmRUb2tlbgorRGlyZWN0aXZlVG9rZW4gPSB5YW1sLnRva2Vucy5EaXJlY3RpdmVUb2tlbgorRG9jdW1lbnRTdGFydFRva2VuID0geWFtbC50b2tlbnMuRG9jdW1lbnRTdGFydFRva2VuCitEb2N1bWVudEVuZFRva2VuID0geWFtbC50b2tlbnMuRG9jdW1lbnRFbmRUb2tlbgorQmxvY2tTZXF1ZW5jZVN0YXJ0VG9rZW4gPSB5YW1sLnRva2Vucy5CbG9ja1NlcXVlbmNlU3RhcnRUb2tlbgorQmxvY2tNYXBwaW5nU3RhcnRUb2tlbiA9IHlhbWwudG9rZW5zLkJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4KK0Jsb2NrRW5kVG9rZW4gPSB5YW1sLnRva2Vucy5CbG9ja0VuZFRva2VuCitGbG93U2VxdWVuY2VTdGFydFRva2VuID0geWFtbC50b2tlbnMuRmxvd1NlcXVlbmNlU3RhcnRUb2tlbgorRmxvd01hcHBpbmdTdGFydFRva2VuID0geWFtbC50b2tlbnMuRmxvd01hcHBpbmdTdGFydFRva2VuCitGbG93U2VxdWVuY2VFbmRUb2tlbiA9IHlhbWwudG9rZW5zLkZsb3dTZXF1ZW5jZUVuZFRva2VuCitGbG93TWFwcGluZ0VuZFRva2VuID0geWFtbC50b2tlbnMuRmxvd01hcHBpbmdFbmRUb2tlbgorS2V5VG9rZW4gPSB5YW1sLnRva2Vucy5LZXlUb2tlbgorVmFsdWVUb2tlbiA9IHlhbWwudG9rZW5zLlZhbHVlVG9rZW4KK0Jsb2NrRW50cnlUb2tlbiA9IHlhbWwudG9rZW5zLkJsb2NrRW50cnlUb2tlbgorRmxvd0VudHJ5VG9rZW4gPSB5YW1sLnRva2Vucy5GbG93RW50cnlUb2tlbgorQWxpYXNUb2tlbiA9IHlhbWwudG9rZW5zLkFsaWFzVG9rZW4KK0FuY2hvclRva2VuID0geWFtbC50b2tlbnMuQW5jaG9yVG9rZW4KK1RhZ1Rva2VuID0geWFtbC50b2tlbnMuVGFnVG9rZW4KK1NjYWxhclRva2VuID0geWFtbC50b2tlbnMuU2NhbGFyVG9rZW4KKworU3RyZWFtU3RhcnRFdmVudCA9IHlhbWwuZXZlbnRzLlN0cmVhbVN0YXJ0RXZlbnQKK1N0cmVhbUVuZEV2ZW50ID0geWFtbC5ldmVudHMuU3RyZWFtRW5kRXZlbnQKK0RvY3VtZW50U3RhcnRFdmVudCA9IHlhbWwuZXZlbnRzLkRvY3VtZW50U3RhcnRFdmVudAorRG9jdW1lbnRFbmRFdmVudCA9IHlhbWwuZXZlbnRzLkRvY3VtZW50RW5kRXZlbnQKK0FsaWFzRXZlbnQgPSB5YW1sLmV2ZW50cy5BbGlhc0V2ZW50CitTY2FsYXJFdmVudCA9IHlhbWwuZXZlbnRzLlNjYWxhckV2ZW50CitTZXF1ZW5jZVN0YXJ0RXZlbnQgPSB5YW1sLmV2ZW50cy5TZXF1ZW5jZVN0YXJ0RXZlbnQKK1NlcXVlbmNlRW5kRXZlbnQgPSB5YW1sLmV2ZW50cy5TZXF1ZW5jZUVuZEV2ZW50CitNYXBwaW5nU3RhcnRFdmVudCA9IHlhbWwuZXZlbnRzLk1hcHBpbmdTdGFydEV2ZW50CitNYXBwaW5nRW5kRXZlbnQgPSB5YW1sLmV2ZW50cy5NYXBwaW5nRW5kRXZlbnQKKworU2NhbGFyTm9kZSA9IHlhbWwubm9kZXMuU2NhbGFyTm9kZQorU2VxdWVuY2VOb2RlID0geWFtbC5ub2Rlcy5TZXF1ZW5jZU5vZGUKK01hcHBpbmdOb2RlID0geWFtbC5ub2Rlcy5NYXBwaW5nTm9kZQorCitjZGVmIGNsYXNzIE1hcms6CisgICAgY2RlZiByZWFkb25seSBvYmplY3QgbmFtZQorICAgIGNkZWYgcmVhZG9ubHkgaW50IGluZGV4CisgICAgY2RlZiByZWFkb25seSBpbnQgbGluZQorICAgIGNkZWYgcmVhZG9ubHkgaW50IGNvbHVtbgorICAgIGNkZWYgcmVhZG9ubHkgYnVmZmVyCisgICAgY2RlZiByZWFkb25seSBwb2ludGVyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0IG5hbWUsIGludCBpbmRleCwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICBvYmplY3QgYnVmZmVyLCBvYmplY3QgcG9pbnRlcik6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKyAgICAgICAgc2VsZi5jb2x1bW4gPSBjb2x1bW4KKyAgICAgICAgc2VsZi5idWZmZXIgPSBidWZmZXIKKyAgICAgICAgc2VsZi5wb2ludGVyID0gcG9pbnRlcgorCisgICAgZGVmIGdldF9zbmlwcGV0KHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHdoZXJlID0gIiAgaW4gXCIlc1wiLCBsaW5lICVkLCBjb2x1bW4gJWQiICAgXAorICAgICAgICAgICAgICAgICUgKHNlbGYubmFtZSwgc2VsZi5saW5lKzEsIHNlbGYuY29sdW1uKzEpCisgICAgICAgIHJldHVybiB3aGVyZQorCisjY2xhc3MgWUFNTEVycm9yKEV4Y2VwdGlvbik6CisjICAgIHBhc3MKKyMKKyNjbGFzcyBNYXJrZWRZQU1MRXJyb3IoWUFNTEVycm9yKToKKyMKKyMgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRleHQ9Tm9uZSwgY29udGV4dF9tYXJrPU5vbmUsCisjICAgICAgICAgICAgcHJvYmxlbT1Ob25lLCBwcm9ibGVtX21hcms9Tm9uZSwgbm90ZT1Ob25lKToKKyMgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKKyMgICAgICAgIHNlbGYuY29udGV4dF9tYXJrID0gY29udGV4dF9tYXJrCisjICAgICAgICBzZWxmLnByb2JsZW0gPSBwcm9ibGVtCisjICAgICAgICBzZWxmLnByb2JsZW1fbWFyayA9IHByb2JsZW1fbWFyaworIyAgICAgICAgc2VsZi5ub3RlID0gbm90ZQorIworIyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyMgICAgICAgIGxpbmVzID0gW10KKyMgICAgICAgIGlmIHNlbGYuY29udGV4dCBpcyBub3QgTm9uZToKKyMgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc2VsZi5jb250ZXh0KQorIyAgICAgICAgaWYgc2VsZi5jb250ZXh0X21hcmsgaXMgbm90IE5vbmUgIFwKKyMgICAgICAgICAgICBhbmQgKHNlbGYucHJvYmxlbSBpcyBOb25lIG9yIHNlbGYucHJvYmxlbV9tYXJrIGlzIE5vbmUKKyMgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuY29udGV4dF9tYXJrLm5hbWUgIT0gc2VsZi5wcm9ibGVtX21hcmsubmFtZQorIyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5jb250ZXh0X21hcmsubGluZSAhPSBzZWxmLnByb2JsZW1fbWFyay5saW5lCisjICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmNvbnRleHRfbWFyay5jb2x1bW4gIT0gc2VsZi5wcm9ibGVtX21hcmsuY29sdW1uKToKKyMgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3RyKHNlbGYuY29udGV4dF9tYXJrKSkKKyMgICAgICAgIGlmIHNlbGYucHJvYmxlbSBpcyBub3QgTm9uZToKKyMgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc2VsZi5wcm9ibGVtKQorIyAgICAgICAgaWYgc2VsZi5wcm9ibGVtX21hcmsgaXMgbm90IE5vbmU6CisjICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN0cihzZWxmLnByb2JsZW1fbWFyaykpCisjICAgICAgICBpZiBzZWxmLm5vdGUgaXMgbm90IE5vbmU6CisjICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYubm90ZSkKKyMgICAgICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCisjCisjY2xhc3MgUmVhZGVyRXJyb3IoWUFNTEVycm9yKToKKyMKKyMgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBvc2l0aW9uLCBjaGFyYWN0ZXIsIGVuY29kaW5nLCByZWFzb24pOgorIyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorIyAgICAgICAgc2VsZi5jaGFyYWN0ZXIgPSBjaGFyYWN0ZXIKKyMgICAgICAgIHNlbGYucG9zaXRpb24gPSBwb3NpdGlvbgorIyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisjICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgorIworIyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyMgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jaGFyYWN0ZXIsIHN0cik6CisjICAgICAgICAgICAgcmV0dXJuICInJXMnIGNvZGVjIGNhbid0IGRlY29kZSBieXRlICN4JTAyeDogJXNcbiIgIFwKKyMgICAgICAgICAgICAgICAgICAgICIgIGluIFwiJXNcIiwgcG9zaXRpb24gJWQiICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZW5jb2RpbmcsIG9yZChzZWxmLmNoYXJhY3RlciksIHNlbGYucmVhc29uLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucG9zaXRpb24pCisjICAgICAgICBlbHNlOgorIyAgICAgICAgICAgIHJldHVybiAidW5hY2NlcHRhYmxlIGNoYXJhY3RlciAjeCUwNHg6ICVzXG4iICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICIgIGluIFwiJXNcIiwgcG9zaXRpb24gJWQiICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICUgKG9yZChzZWxmLmNoYXJhY3RlciksIHNlbGYucmVhc29uLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucG9zaXRpb24pCisjCisjY2xhc3MgU2Nhbm5lckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisjICAgIHBhc3MKKyMKKyNjbGFzcyBQYXJzZXJFcnJvcihNYXJrZWRZQU1MRXJyb3IpOgorIyAgICBwYXNzCisjCisjY2xhc3MgRW1pdHRlckVycm9yKFlBTUxFcnJvcik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIFRva2VuOgorIyAgICBjZGVmIHJlYWRvbmx5IE1hcmsgc3RhcnRfbWFyaworIyAgICBjZGVmIHJlYWRvbmx5IE1hcmsgZW5kX21hcmsKKyMgICAgZGVmIF9faW5pdF9fKHNlbGYsIE1hcmsgc3RhcnRfbWFyaywgTWFyayBlbmRfbWFyayk6CisjICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisjICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyMKKyNjZGVmIGNsYXNzIFN0cmVhbVN0YXJ0VG9rZW4oVG9rZW4pOgorIyAgICBjZGVmIHJlYWRvbmx5IG9iamVjdCBlbmNvZGluZworIyAgICBkZWYgX19pbml0X18oc2VsZiwgTWFyayBzdGFydF9tYXJrLCBNYXJrIGVuZF9tYXJrLCBlbmNvZGluZyk6CisjICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisjICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyMgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworIworI2NkZWYgY2xhc3MgU3RyZWFtRW5kVG9rZW4oVG9rZW4pOgorIyAgICBwYXNzCisjCisjY2RlZiBjbGFzcyBEaXJlY3RpdmVUb2tlbihUb2tlbik6CisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IG5hbWUKKyMgICAgY2RlZiByZWFkb25seSBvYmplY3QgdmFsdWUKKyMgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZhbHVlLCBNYXJrIHN0YXJ0X21hcmssIE1hcmsgZW5kX21hcmspOgorIyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorIyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisjICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisjICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyMKKyNjZGVmIGNsYXNzIERvY3VtZW50U3RhcnRUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIERvY3VtZW50RW5kVG9rZW4oVG9rZW4pOgorIyAgICBwYXNzCisjCisjY2RlZiBjbGFzcyBCbG9ja1NlcXVlbmNlU3RhcnRUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4oVG9rZW4pOgorIyAgICBwYXNzCisjCisjY2RlZiBjbGFzcyBCbG9ja0VuZFRva2VuKFRva2VuKToKKyMgICAgcGFzcworIworI2NkZWYgY2xhc3MgRmxvd1NlcXVlbmNlU3RhcnRUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEZsb3dNYXBwaW5nU3RhcnRUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEZsb3dTZXF1ZW5jZUVuZFRva2VuKFRva2VuKToKKyMgICAgcGFzcworIworI2NkZWYgY2xhc3MgRmxvd01hcHBpbmdFbmRUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEtleVRva2VuKFRva2VuKToKKyMgICAgcGFzcworIworI2NkZWYgY2xhc3MgVmFsdWVUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEJsb2NrRW50cnlUb2tlbihUb2tlbik6CisjICAgIHBhc3MKKyMKKyNjZGVmIGNsYXNzIEZsb3dFbnRyeVRva2VuKFRva2VuKToKKyMgICAgcGFzcworIworI2NkZWYgY2xhc3MgQWxpYXNUb2tlbihUb2tlbik6CisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHZhbHVlCisjICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgTWFyayBzdGFydF9tYXJrLCBNYXJrIGVuZF9tYXJrKToKKyMgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorIyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworIyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisjCisjY2RlZiBjbGFzcyBBbmNob3JUb2tlbihUb2tlbik6CisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHZhbHVlCisjICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgTWFyayBzdGFydF9tYXJrLCBNYXJrIGVuZF9tYXJrKToKKyMgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorIyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworIyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisjCisjY2RlZiBjbGFzcyBUYWdUb2tlbihUb2tlbik6CisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHZhbHVlCisjICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgTWFyayBzdGFydF9tYXJrLCBNYXJrIGVuZF9tYXJrKToKKyMgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorIyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworIyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisjCisjY2RlZiBjbGFzcyBTY2FsYXJUb2tlbihUb2tlbik6CisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHZhbHVlCisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHBsYWluCisjICAgIGNkZWYgcmVhZG9ubHkgb2JqZWN0IHN0eWxlCisjICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgcGxhaW4sIE1hcmsgc3RhcnRfbWFyaywgTWFyayBlbmRfbWFyaywgc3R5bGU9Tm9uZSk6CisjICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyMgICAgICAgIHNlbGYucGxhaW4gPSBwbGFpbgorIyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworIyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisjICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKKworY2RlZiBjbGFzcyBDUGFyc2VyOgorCisgICAgY2RlZiB5YW1sX3BhcnNlcl90IHBhcnNlcgorICAgIGNkZWYgeWFtbF9ldmVudF90IHBhcnNlZF9ldmVudAorCisgICAgY2RlZiBvYmplY3Qgc3RyZWFtCisgICAgY2RlZiBvYmplY3Qgc3RyZWFtX25hbWUKKyAgICBjZGVmIG9iamVjdCBjdXJyZW50X3Rva2VuCisgICAgY2RlZiBvYmplY3QgY3VycmVudF9ldmVudAorICAgIGNkZWYgb2JqZWN0IGFuY2hvcnMKKyAgICBjZGVmIG9iamVjdCBzdHJlYW1fY2FjaGUKKyAgICBjZGVmIGludCBzdHJlYW1fY2FjaGVfbGVuCisgICAgY2RlZiBpbnQgc3RyZWFtX2NhY2hlX3BvcworICAgIGNkZWYgaW50IHVuaWNvZGVfc291cmNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtKToKKyAgICAgICAgY2RlZiBpc19yZWFkYWJsZQorICAgICAgICBpZiB5YW1sX3BhcnNlcl9pbml0aWFsaXplKCZzZWxmLnBhcnNlcikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPSBZQU1MX05PX0VWRU5UCisgICAgICAgIGlzX3JlYWRhYmxlID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdHJlYW0ucmVhZAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBpc19yZWFkYWJsZSA9IDAKKyAgICAgICAgc2VsZi51bmljb2RlX3NvdXJjZSA9IDAKKyAgICAgICAgaWYgaXNfcmVhZGFibGU6CisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX25hbWUgPSBzdHJlYW0ubmFtZQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9uYW1lID0gJzxmaWxlPicKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9uYW1lID0gdSc8ZmlsZT4nCisgICAgICAgICAgICBzZWxmLnN0cmVhbV9jYWNoZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtX2NhY2hlX2xlbiA9IDAKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtX2NhY2hlX3BvcyA9IDAKKyAgICAgICAgICAgIHlhbWxfcGFyc2VyX3NldF9pbnB1dCgmc2VsZi5wYXJzZXIsIGlucHV0X2hhbmRsZXIsIDx2b2lkICo+c2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KHN0cmVhbSkgIT0gMDoKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHN0cmVhbSkKKyAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fbmFtZSA9ICc8dW5pY29kZSBzdHJpbmc+JworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX25hbWUgPSB1Jzx1bmljb2RlIHN0cmluZz4nCisgICAgICAgICAgICAgICAgc2VsZi51bmljb2RlX3NvdXJjZSA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX25hbWUgPSAnPGJ5dGUgc3RyaW5nPicKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9uYW1lID0gdSc8Ynl0ZSBzdHJpbmc+JworICAgICAgICAgICAgaWYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzdHJlYW0pID09IDA6CisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYSBzdHJpbmcgb3Igc3RyZWFtIGlucHV0IGlzIHJlcXVpcmVkIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJhIHN0cmluZyBvciBzdHJlYW0gaW5wdXQgaXMgcmVxdWlyZWQiKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgICAgIHlhbWxfcGFyc2VyX3NldF9pbnB1dF9zdHJpbmcoJnNlbGYucGFyc2VyLCBQeVN0cmluZ19BU19TVFJJTkcoc3RyZWFtKSwgUHlTdHJpbmdfR0VUX1NJWkUoc3RyZWFtKSkKKyAgICAgICAgc2VsZi5jdXJyZW50X3Rva2VuID0gTm9uZQorICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBOb25lCisgICAgICAgIHNlbGYuYW5jaG9ycyA9IHt9CisKKyAgICBkZWYgX19kZWFsbG9jX18oc2VsZik6CisgICAgICAgIHlhbWxfcGFyc2VyX2RlbGV0ZSgmc2VsZi5wYXJzZXIpCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZzZWxmLnBhcnNlZF9ldmVudCkKKworICAgIGRlZiBkaXNwb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBjZGVmIG9iamVjdCBfcGFyc2VyX2Vycm9yKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBhcnNlci5lcnJvciA9PSBZQU1MX01FTU9SWV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBNZW1vcnlFcnJvcgorICAgICAgICBlbGlmIHNlbGYucGFyc2VyLmVycm9yID09IFlBTUxfUkVBREVSX0VSUk9SOgorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRlckVycm9yKHNlbGYuc3RyZWFtX25hbWUsIHNlbGYucGFyc2VyLnByb2JsZW1fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucHJvYmxlbV92YWx1ZSwgJz8nLCBzZWxmLnBhcnNlci5wcm9ibGVtKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGVyRXJyb3Ioc2VsZi5zdHJlYW1fbmFtZSwgc2VsZi5wYXJzZXIucHJvYmxlbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wcm9ibGVtX3ZhbHVlLCB1Jz8nLCBQeVVuaWNvZGVfRnJvbVN0cmluZyhzZWxmLnBhcnNlci5wcm9ibGVtKSkKKyAgICAgICAgZWxpZiBzZWxmLnBhcnNlci5lcnJvciA9PSBZQU1MX1NDQU5ORVJfRVJST1IgICAgXAorICAgICAgICAgICAgICAgIG9yIHNlbGYucGFyc2VyLmVycm9yID09IFlBTUxfUEFSU0VSX0VSUk9SOgorICAgICAgICAgICAgY29udGV4dF9tYXJrID0gTm9uZQorICAgICAgICAgICAgcHJvYmxlbV9tYXJrID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuY29udGV4dCAhPSBOVUxMOgorICAgICAgICAgICAgICAgIGNvbnRleHRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbnRleHRfbWFyay5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbnRleHRfbWFyay5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29udGV4dF9tYXJrLmNvbHVtbiwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnByb2JsZW0gIT0gTlVMTDoKKyAgICAgICAgICAgICAgICBwcm9ibGVtX21hcmsgPSBNYXJrKHNlbGYuc3RyZWFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wcm9ibGVtX21hcmsuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wcm9ibGVtX21hcmsubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnByb2JsZW1fbWFyay5jb2x1bW4sIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBjb250ZXh0ID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuY29udGV4dCAhPSBOVUxMOgorICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gc2VsZi5wYXJzZXIuY29udGV4dAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhzZWxmLnBhcnNlci5jb250ZXh0KQorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcHJvYmxlbSA9IHNlbGYucGFyc2VyLnByb2JsZW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvYmxlbSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNlbGYucGFyc2VyLnByb2JsZW0pCisgICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5lcnJvciA9PSBZQU1MX1NDQU5ORVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjYW5uZXJFcnJvcihjb250ZXh0LCBjb250ZXh0X21hcmssIHByb2JsZW0sIHByb2JsZW1fbWFyaykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlckVycm9yKGNvbnRleHQsIGNvbnRleHRfbWFyaywgcHJvYmxlbSwgcHJvYmxlbV9tYXJrKQorICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIHBhcnNlciBlcnJvciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHUibm8gcGFyc2VyIGVycm9yIikKKworICAgIGRlZiByYXdfc2NhbihzZWxmKToKKyAgICAgICAgY2RlZiB5YW1sX3Rva2VuX3QgdG9rZW4KKyAgICAgICAgY2RlZiBpbnQgZG9uZQorICAgICAgICBjZGVmIGludCBjb3VudAorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZG9uZSA9IDAKKyAgICAgICAgd2hpbGUgZG9uZSA9PSAwOgorICAgICAgICAgICAgaWYgeWFtbF9wYXJzZXJfc2Nhbigmc2VsZi5wYXJzZXIsICZ0b2tlbikgPT0gMDoKKyAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX3BhcnNlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gWUFNTF9OT19UT0tFTjoKKyAgICAgICAgICAgICAgICBkb25lID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50KzEKKyAgICAgICAgICAgIHlhbWxfdG9rZW5fZGVsZXRlKCZ0b2tlbikKKyAgICAgICAgcmV0dXJuIGNvdW50CisKKyAgICBjZGVmIG9iamVjdCBfc2NhbihzZWxmKToKKyAgICAgICAgY2RlZiB5YW1sX3Rva2VuX3QgdG9rZW4KKyAgICAgICAgaWYgeWFtbF9wYXJzZXJfc2Nhbigmc2VsZi5wYXJzZXIsICZ0b2tlbikgPT0gMDoKKyAgICAgICAgICAgIGVycm9yID0gc2VsZi5fcGFyc2VyX2Vycm9yKCkKKyAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgIHRva2VuX29iamVjdCA9IHNlbGYuX3Rva2VuX3RvX29iamVjdCgmdG9rZW4pCisgICAgICAgIHlhbWxfdG9rZW5fZGVsZXRlKCZ0b2tlbikKKyAgICAgICAgcmV0dXJuIHRva2VuX29iamVjdAorCisgICAgY2RlZiBvYmplY3QgX3Rva2VuX3RvX29iamVjdChzZWxmLCB5YW1sX3Rva2VuX3QgKnRva2VuKToKKyAgICAgICAgc3RhcnRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICB0b2tlbi5zdGFydF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIHRva2VuLnN0YXJ0X21hcmsubGluZSwKKyAgICAgICAgICAgICAgICB0b2tlbi5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBlbmRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICB0b2tlbi5lbmRfbWFyay5pbmRleCwKKyAgICAgICAgICAgICAgICB0b2tlbi5lbmRfbWFyay5saW5lLAorICAgICAgICAgICAgICAgIHRva2VuLmVuZF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBpZiB0b2tlbi50eXBlID09IFlBTUxfTk9fVE9LRU46CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9TVFJFQU1fU1RBUlRfVE9LRU46CisgICAgICAgICAgICBlbmNvZGluZyA9IE5vbmUKKyAgICAgICAgICAgIGlmIHRva2VuLmRhdGEuc3RyZWFtX3N0YXJ0LmVuY29kaW5nID09IFlBTUxfVVRGOF9FTkNPRElORzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnVuaWNvZGVfc291cmNlID09IDA6CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gdSJ1dGYtOCIKKyAgICAgICAgICAgIGVsaWYgdG9rZW4uZGF0YS5zdHJlYW1fc3RhcnQuZW5jb2RpbmcgPT0gWUFNTF9VVEYxNkxFX0VOQ09ESU5HOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gdSJ1dGYtMTYtbGUiCisgICAgICAgICAgICBlbGlmIHRva2VuLmRhdGEuc3RyZWFtX3N0YXJ0LmVuY29kaW5nID09IFlBTUxfVVRGMTZCRV9FTkNPRElORzoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHUidXRmLTE2LWJlIgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVN0YXJ0VG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmssIGVuY29kaW5nKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9TVFJFQU1fRU5EX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbUVuZFRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9WRVJTSU9OX0RJUkVDVElWRV9UT0tFTjoKKyAgICAgICAgICAgIHJldHVybiBEaXJlY3RpdmVUb2tlbih1IllBTUwiLAorICAgICAgICAgICAgICAgICAgICAodG9rZW4uZGF0YS52ZXJzaW9uX2RpcmVjdGl2ZS5tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmRhdGEudmVyc2lvbl9kaXJlY3RpdmUubWlub3IpLAorICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiB0b2tlbi50eXBlID09IFlBTUxfVEFHX0RJUkVDVElWRV9UT0tFTjoKKyAgICAgICAgICAgIGhhbmRsZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHRva2VuLmRhdGEudGFnX2RpcmVjdGl2ZS5oYW5kbGUpCisgICAgICAgICAgICBwcmVmaXggPSBQeVVuaWNvZGVfRnJvbVN0cmluZyh0b2tlbi5kYXRhLnRhZ19kaXJlY3RpdmUucHJlZml4KQorICAgICAgICAgICAgcmV0dXJuIERpcmVjdGl2ZVRva2VuKHUiVEFHIiwgKGhhbmRsZSwgcHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX0RPQ1VNRU5UX1NUQVJUX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50U3RhcnRUb2tlbihzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiB0b2tlbi50eXBlID09IFlBTUxfRE9DVU1FTlRfRU5EX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50RW5kVG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX0JMT0NLX1NFUVVFTkNFX1NUQVJUX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEJsb2NrU2VxdWVuY2VTdGFydFRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9CTE9DS19NQVBQSU5HX1NUQVJUX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX0JMT0NLX0VORF9UT0tFTjoKKyAgICAgICAgICAgIHJldHVybiBCbG9ja0VuZFRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9GTE9XX1NFUVVFTkNFX1NUQVJUX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEZsb3dTZXF1ZW5jZVN0YXJ0VG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX0ZMT1dfU0VRVUVOQ0VfRU5EX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEZsb3dTZXF1ZW5jZUVuZFRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9GTE9XX01BUFBJTkdfU1RBUlRfVE9LRU46CisgICAgICAgICAgICByZXR1cm4gRmxvd01hcHBpbmdTdGFydFRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9GTE9XX01BUFBJTkdfRU5EX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEZsb3dNYXBwaW5nRW5kVG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX0JMT0NLX0VOVFJZX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEJsb2NrRW50cnlUb2tlbihzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiB0b2tlbi50eXBlID09IFlBTUxfRkxPV19FTlRSWV9UT0tFTjoKKyAgICAgICAgICAgIHJldHVybiBGbG93RW50cnlUb2tlbihzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiB0b2tlbi50eXBlID09IFlBTUxfS0VZX1RPS0VOOgorICAgICAgICAgICAgcmV0dXJuIEtleVRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9WQUxVRV9UT0tFTjoKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZVRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9BTElBU19UT0tFTjoKKyAgICAgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodG9rZW4uZGF0YS5hbGlhcy52YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBBbGlhc1Rva2VuKHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiB0b2tlbi50eXBlID09IFlBTUxfQU5DSE9SX1RPS0VOOgorICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyh0b2tlbi5kYXRhLmFuY2hvci52YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBBbmNob3JUb2tlbih2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgdG9rZW4udHlwZSA9PSBZQU1MX1RBR19UT0tFTjoKKyAgICAgICAgICAgIGhhbmRsZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHRva2VuLmRhdGEudGFnLmhhbmRsZSkKKyAgICAgICAgICAgIHN1ZmZpeCA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHRva2VuLmRhdGEudGFnLnN1ZmZpeCkKKyAgICAgICAgICAgIGlmIG5vdCBoYW5kbGU6CisgICAgICAgICAgICAgICAgaGFuZGxlID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIFRhZ1Rva2VuKChoYW5kbGUsIHN1ZmZpeCksIHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIHRva2VuLnR5cGUgPT0gWUFNTF9TQ0FMQVJfVE9LRU46CisgICAgICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHRva2VuLmRhdGEuc2NhbGFyLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICB0b2tlbi5kYXRhLnNjYWxhci5sZW5ndGgsICdzdHJpY3QnKQorICAgICAgICAgICAgcGxhaW4gPSBGYWxzZQorICAgICAgICAgICAgc3R5bGUgPSBOb25lCisgICAgICAgICAgICBpZiB0b2tlbi5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX1BMQUlOX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBwbGFpbiA9IFRydWUKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnJworICAgICAgICAgICAgZWxpZiB0b2tlbi5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX1NJTkdMRV9RVU9URURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgICAgIHN0eWxlID0gdSdcJycKKyAgICAgICAgICAgIGVsaWYgdG9rZW4uZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9ET1VCTEVfUVVPVEVEX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnIicKKyAgICAgICAgICAgIGVsaWYgdG9rZW4uZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9MSVRFUkFMX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnfCcKKyAgICAgICAgICAgIGVsaWYgdG9rZW4uZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9GT0xERURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgICAgIHN0eWxlID0gdSc+JworICAgICAgICAgICAgcmV0dXJuIFNjYWxhclRva2VuKHZhbHVlLCBwbGFpbiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIHN0eWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0b2tlbiB0eXBlIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih1InVua25vd24gdG9rZW4gdHlwZSIpCisKKyAgICBkZWYgZ2V0X3Rva2VuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfdG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY3VycmVudF90b2tlbgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rva2VuID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9zY2FuKCkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgcGVla190b2tlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Rva2VuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdG9rZW4gPSBzZWxmLl9zY2FuKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF90b2tlbgorCisgICAgZGVmIGNoZWNrX3Rva2VuKHNlbGYsICpjaG9pY2VzKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Rva2VuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdG9rZW4gPSBzZWxmLl9zY2FuKCkKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3Rva2VuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbm90IGNob2ljZXM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICB0b2tlbl9jbGFzcyA9IHNlbGYuY3VycmVudF90b2tlbi5fX2NsYXNzX18KKyAgICAgICAgZm9yIGNob2ljZSBpbiBjaG9pY2VzOgorICAgICAgICAgICAgaWYgdG9rZW5fY2xhc3MgaXMgY2hvaWNlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHJhd19wYXJzZShzZWxmKToKKyAgICAgICAgY2RlZiB5YW1sX2V2ZW50X3QgZXZlbnQKKyAgICAgICAgY2RlZiBpbnQgZG9uZQorICAgICAgICBjZGVmIGludCBjb3VudAorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZG9uZSA9IDAKKyAgICAgICAgd2hpbGUgZG9uZSA9PSAwOgorICAgICAgICAgICAgaWYgeWFtbF9wYXJzZXJfcGFyc2UoJnNlbGYucGFyc2VyLCAmZXZlbnQpID09IDA6CisgICAgICAgICAgICAgICAgZXJyb3IgPSBzZWxmLl9wYXJzZXJfZXJyb3IoKQorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgICAgICBpZiBldmVudC50eXBlID09IFlBTUxfTk9fRVZFTlQ6CisgICAgICAgICAgICAgICAgZG9uZSA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCsxCisgICAgICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmZXZlbnQpCisgICAgICAgIHJldHVybiBjb3VudAorCisgICAgY2RlZiBvYmplY3QgX3BhcnNlKHNlbGYpOgorICAgICAgICBjZGVmIHlhbWxfZXZlbnRfdCBldmVudAorICAgICAgICBpZiB5YW1sX3BhcnNlcl9wYXJzZSgmc2VsZi5wYXJzZXIsICZldmVudCkgPT0gMDoKKyAgICAgICAgICAgIGVycm9yID0gc2VsZi5fcGFyc2VyX2Vycm9yKCkKKyAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgIGV2ZW50X29iamVjdCA9IHNlbGYuX2V2ZW50X3RvX29iamVjdCgmZXZlbnQpCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZldmVudCkKKyAgICAgICAgcmV0dXJuIGV2ZW50X29iamVjdAorCisgICAgY2RlZiBvYmplY3QgX2V2ZW50X3RvX29iamVjdChzZWxmLCB5YW1sX2V2ZW50X3QgKmV2ZW50KToKKyAgICAgICAgY2RlZiB5YW1sX3RhZ19kaXJlY3RpdmVfdCAqdGFnX2RpcmVjdGl2ZQorICAgICAgICBzdGFydF9tYXJrID0gTWFyayhzZWxmLnN0cmVhbV9uYW1lLAorICAgICAgICAgICAgICAgIGV2ZW50LnN0YXJ0X21hcmsuaW5kZXgsCisgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnRfbWFyay5saW5lLAorICAgICAgICAgICAgICAgIGV2ZW50LnN0YXJ0X21hcmsuY29sdW1uLAorICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgIGVuZF9tYXJrID0gTWFyayhzZWxmLnN0cmVhbV9uYW1lLAorICAgICAgICAgICAgICAgIGV2ZW50LmVuZF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIGV2ZW50LmVuZF9tYXJrLmxpbmUsCisgICAgICAgICAgICAgICAgZXZlbnQuZW5kX21hcmsuY29sdW1uLAorICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gWUFNTF9OT19FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSBZQU1MX1NUUkVBTV9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgIGVuY29kaW5nID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zdHJlYW1fc3RhcnQuZW5jb2RpbmcgPT0gWUFNTF9VVEY4X0VOQ09ESU5HOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudW5pY29kZV9zb3VyY2UgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSB1InV0Zi04IgorICAgICAgICAgICAgZWxpZiBldmVudC5kYXRhLnN0cmVhbV9zdGFydC5lbmNvZGluZyA9PSBZQU1MX1VURjE2TEVfRU5DT0RJTkc6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSB1InV0Zi0xNi1sZSIKKyAgICAgICAgICAgIGVsaWYgZXZlbnQuZGF0YS5zdHJlYW1fc3RhcnQuZW5jb2RpbmcgPT0gWUFNTF9VVEYxNkJFX0VOQ09ESU5HOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gdSJ1dGYtMTYtYmUiCisgICAgICAgICAgICByZXR1cm4gU3RyZWFtU3RhcnRFdmVudChzdGFydF9tYXJrLCBlbmRfbWFyaywgZW5jb2RpbmcpCisgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSBZQU1MX1NUUkVBTV9FTkRfRVZFTlQ6CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtRW5kRXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSBZQU1MX0RPQ1VNRU5UX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgZXhwbGljaXQgPSBGYWxzZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5kb2N1bWVudF9zdGFydC5pbXBsaWNpdCA9PSAwOgorICAgICAgICAgICAgICAgIGV4cGxpY2l0ID0gVHJ1ZQorICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEuZG9jdW1lbnRfc3RhcnQudmVyc2lvbl9kaXJlY3RpdmUgIT0gTlVMTDoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gKGV2ZW50LmRhdGEuZG9jdW1lbnRfc3RhcnQudmVyc2lvbl9kaXJlY3RpdmUubWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5kYXRhLmRvY3VtZW50X3N0YXJ0LnZlcnNpb25fZGlyZWN0aXZlLm1pbm9yKQorICAgICAgICAgICAgdGFncyA9IE5vbmUKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEuZG9jdW1lbnRfc3RhcnQudGFnX2RpcmVjdGl2ZXMuc3RhcnQgIT0gTlVMTDoKKyAgICAgICAgICAgICAgICB0YWdzID0ge30KKyAgICAgICAgICAgICAgICB0YWdfZGlyZWN0aXZlID0gZXZlbnQuZGF0YS5kb2N1bWVudF9zdGFydC50YWdfZGlyZWN0aXZlcy5zdGFydAorICAgICAgICAgICAgICAgIHdoaWxlIHRhZ19kaXJlY3RpdmUgIT0gZXZlbnQuZGF0YS5kb2N1bWVudF9zdGFydC50YWdfZGlyZWN0aXZlcy5lbmQ6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHRhZ19kaXJlY3RpdmUuaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBQeVVuaWNvZGVfRnJvbVN0cmluZyh0YWdfZGlyZWN0aXZlLnByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgdGFnc1toYW5kbGVdID0gcHJlZml4CisgICAgICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmUgPSB0YWdfZGlyZWN0aXZlKzEKKyAgICAgICAgICAgIHJldHVybiBEb2N1bWVudFN0YXJ0RXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0LCB2ZXJzaW9uLCB0YWdzKQorICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gWUFNTF9ET0NVTUVOVF9FTkRfRVZFTlQ6CisgICAgICAgICAgICBleHBsaWNpdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBldmVudC5kYXRhLmRvY3VtZW50X2VuZC5pbXBsaWNpdCA9PSAwOgorICAgICAgICAgICAgICAgIGV4cGxpY2l0ID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50RW5kRXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmssIGV4cGxpY2l0KQorICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gWUFNTF9BTElBU19FVkVOVDoKKyAgICAgICAgICAgIGFuY2hvciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGV2ZW50LmRhdGEuYWxpYXMuYW5jaG9yKQorICAgICAgICAgICAgcmV0dXJuIEFsaWFzRXZlbnQoYW5jaG9yLCBzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgZWxpZiBldmVudC50eXBlID09IFlBTUxfU0NBTEFSX0VWRU5UOgorICAgICAgICAgICAgYW5jaG9yID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zY2FsYXIuYW5jaG9yICE9IE5VTEw6CisgICAgICAgICAgICAgICAgYW5jaG9yID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoZXZlbnQuZGF0YS5zY2FsYXIuYW5jaG9yKQorICAgICAgICAgICAgdGFnID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zY2FsYXIudGFnICE9IE5VTEw6CisgICAgICAgICAgICAgICAgdGFnID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoZXZlbnQuZGF0YS5zY2FsYXIudGFnKQorICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChldmVudC5kYXRhLnNjYWxhci52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5zY2FsYXIubGVuZ3RoLCAnc3RyaWN0JykKKyAgICAgICAgICAgIHBsYWluX2ltcGxpY2l0ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEuc2NhbGFyLnBsYWluX2ltcGxpY2l0ID09IDE6CisgICAgICAgICAgICAgICAgcGxhaW5faW1wbGljaXQgPSBUcnVlCisgICAgICAgICAgICBxdW90ZWRfaW1wbGljaXQgPSBGYWxzZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zY2FsYXIucXVvdGVkX2ltcGxpY2l0ID09IDE6CisgICAgICAgICAgICAgICAgcXVvdGVkX2ltcGxpY2l0ID0gVHJ1ZQorICAgICAgICAgICAgc3R5bGUgPSBOb25lCisgICAgICAgICAgICBpZiBldmVudC5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX1BMQUlOX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnJworICAgICAgICAgICAgZWxpZiBldmVudC5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX1NJTkdMRV9RVU9URURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgICAgIHN0eWxlID0gdSdcJycKKyAgICAgICAgICAgIGVsaWYgZXZlbnQuZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9ET1VCTEVfUVVPVEVEX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnIicKKyAgICAgICAgICAgIGVsaWYgZXZlbnQuZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9MSVRFUkFMX1NDQUxBUl9TVFlMRToKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHUnfCcKKyAgICAgICAgICAgIGVsaWYgZXZlbnQuZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9GT0xERURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgICAgIHN0eWxlID0gdSc+JworICAgICAgICAgICAgcmV0dXJuIFNjYWxhckV2ZW50KGFuY2hvciwgdGFnLAorICAgICAgICAgICAgICAgICAgICAocGxhaW5faW1wbGljaXQsIHF1b3RlZF9pbXBsaWNpdCksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyaywgc3R5bGUpCisgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSBZQU1MX1NFUVVFTkNFX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgYW5jaG9yID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC5hbmNob3IgIT0gTlVMTDoKKyAgICAgICAgICAgICAgICBhbmNob3IgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhldmVudC5kYXRhLnNlcXVlbmNlX3N0YXJ0LmFuY2hvcikKKyAgICAgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEuc2VxdWVuY2Vfc3RhcnQudGFnICE9IE5VTEw6CisgICAgICAgICAgICAgICAgdGFnID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC50YWcpCisgICAgICAgICAgICBpbXBsaWNpdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBldmVudC5kYXRhLnNlcXVlbmNlX3N0YXJ0LmltcGxpY2l0ID09IDE6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSBUcnVlCisgICAgICAgICAgICBmbG93X3N0eWxlID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC5zdHlsZSA9PSBZQU1MX0ZMT1dfU0VRVUVOQ0VfU1RZTEU6CisgICAgICAgICAgICAgICAgZmxvd19zdHlsZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC5zdHlsZSA9PSBZQU1MX0JMT0NLX1NFUVVFTkNFX1NUWUxFOgorICAgICAgICAgICAgICAgIGZsb3dfc3R5bGUgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBmbG93X3N0eWxlKQorICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gWUFNTF9NQVBQSU5HX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgYW5jaG9yID0gTm9uZQorICAgICAgICAgICAgaWYgZXZlbnQuZGF0YS5tYXBwaW5nX3N0YXJ0LmFuY2hvciAhPSBOVUxMOgorICAgICAgICAgICAgICAgIGFuY2hvciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGV2ZW50LmRhdGEubWFwcGluZ19zdGFydC5hbmNob3IpCisgICAgICAgICAgICB0YWcgPSBOb25lCisgICAgICAgICAgICBpZiBldmVudC5kYXRhLm1hcHBpbmdfc3RhcnQudGFnICE9IE5VTEw6CisgICAgICAgICAgICAgICAgdGFnID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoZXZlbnQuZGF0YS5tYXBwaW5nX3N0YXJ0LnRhZykKKyAgICAgICAgICAgIGltcGxpY2l0ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEubWFwcGluZ19zdGFydC5pbXBsaWNpdCA9PSAxOgorICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gVHJ1ZQorICAgICAgICAgICAgZmxvd19zdHlsZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGV2ZW50LmRhdGEubWFwcGluZ19zdGFydC5zdHlsZSA9PSBZQU1MX0ZMT1dfTUFQUElOR19TVFlMRToKKyAgICAgICAgICAgICAgICBmbG93X3N0eWxlID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBldmVudC5kYXRhLm1hcHBpbmdfc3RhcnQuc3R5bGUgPT0gWUFNTF9CTE9DS19NQVBQSU5HX1NUWUxFOgorICAgICAgICAgICAgICAgIGZsb3dfc3R5bGUgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIE1hcHBpbmdTdGFydEV2ZW50KGFuY2hvciwgdGFnLCBpbXBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIGZsb3dfc3R5bGUpCisgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSBZQU1MX1NFUVVFTkNFX0VORF9FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZUVuZEV2ZW50KHN0YXJ0X21hcmssIGVuZF9tYXJrKQorICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gWUFNTF9NQVBQSU5HX0VORF9FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiBNYXBwaW5nRW5kRXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGV2ZW50IHR5cGUiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHUidW5rbm93biBldmVudCB0eXBlIikKKworICAgIGRlZiBnZXRfZXZlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9ldmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jdXJyZW50X2V2ZW50CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlKCkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgcGVla19ldmVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2V2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBzZWxmLl9wYXJzZSgpCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfZXZlbnQKKworICAgIGRlZiBjaGVja19ldmVudChzZWxmLCAqY2hvaWNlcyk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9ldmVudCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2V2ZW50ID0gc2VsZi5fcGFyc2UoKQorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfZXZlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBub3QgY2hvaWNlczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV2ZW50X2NsYXNzID0gc2VsZi5jdXJyZW50X2V2ZW50Ll9fY2xhc3NfXworICAgICAgICBmb3IgY2hvaWNlIGluIGNob2ljZXM6CisgICAgICAgICAgICBpZiBldmVudF9jbGFzcyBpcyBjaG9pY2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgY2hlY2tfbm9kZShzZWxmKToKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPT0gWUFNTF9TVFJFQU1fU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmc2VsZi5wYXJzZWRfZXZlbnQpCisgICAgICAgICAgICBzZWxmLl9wYXJzZV9uZXh0X2V2ZW50KCkKKyAgICAgICAgaWYgc2VsZi5wYXJzZWRfZXZlbnQudHlwZSAhPSBZQU1MX1NUUkVBTV9FTkRfRVZFTlQ6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBnZXRfbm9kZShzZWxmKToKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgIT0gWUFNTF9TVFJFQU1fRU5EX0VWRU5UOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBvc2VfZG9jdW1lbnQoKQorCisgICAgZGVmIGdldF9zaW5nbGVfbm9kZShzZWxmKToKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZzZWxmLnBhcnNlZF9ldmVudCkKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIGRvY3VtZW50ID0gTm9uZQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlICE9IFlBTUxfU1RSRUFNX0VORF9FVkVOVDoKKyAgICAgICAgICAgIGRvY3VtZW50ID0gc2VsZi5fY29tcG9zZV9kb2N1bWVudCgpCisgICAgICAgIHNlbGYuX3BhcnNlX25leHRfZXZlbnQoKQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlICE9IFlBTUxfU1RSRUFNX0VORF9FVkVOVDoKKyAgICAgICAgICAgIG1hcmsgPSBNYXJrKHNlbGYuc3RyZWFtX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsubGluZSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZWRfZXZlbnQuc3RhcnRfbWFyay5jb2x1bW4sCisgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wb3NlckVycm9yKCJleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0X21hcmssICJidXQgZm91bmQgYW5vdGhlciBkb2N1bWVudCIsIG1hcmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBvc2VyRXJyb3IodSJleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0X21hcmssIHUiYnV0IGZvdW5kIGFub3RoZXIgZG9jdW1lbnQiLCBtYXJrKQorICAgICAgICByZXR1cm4gZG9jdW1lbnQKKworICAgIGNkZWYgb2JqZWN0IF9jb21wb3NlX2RvY3VtZW50KHNlbGYpOgorICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmc2VsZi5wYXJzZWRfZXZlbnQpCisgICAgICAgIG5vZGUgPSBzZWxmLl9jb21wb3NlX25vZGUoTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZzZWxmLnBhcnNlZF9ldmVudCkKKyAgICAgICAgc2VsZi5hbmNob3JzID0ge30KKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGNkZWYgb2JqZWN0IF9jb21wb3NlX25vZGUoc2VsZiwgb2JqZWN0IHBhcmVudCwgb2JqZWN0IGluZGV4KToKKyAgICAgICAgc2VsZi5fcGFyc2VfbmV4dF9ldmVudCgpCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPT0gWUFNTF9BTElBU19FVkVOVDoKKyAgICAgICAgICAgIGFuY2hvciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuYWxpYXMuYW5jaG9yKQorICAgICAgICAgICAgaWYgYW5jaG9yIG5vdCBpbiBzZWxmLmFuY2hvcnM6CisgICAgICAgICAgICAgICAgbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBvc2VyRXJyb3IoTm9uZSwgTm9uZSwgImZvdW5kIHVuZGVmaW5lZCBhbGlhcyIsIG1hcmspCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcG9zZXJFcnJvcihOb25lLCBOb25lLCB1ImZvdW5kIHVuZGVmaW5lZCBhbGlhcyIsIG1hcmspCisgICAgICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmc2VsZi5wYXJzZWRfZXZlbnQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5hbmNob3JzW2FuY2hvcl0KKyAgICAgICAgYW5jaG9yID0gTm9uZQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlID09IFlBTUxfU0NBTEFSX0VWRU5UICBcCisgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLmFuY2hvciAhPSBOVUxMOgorICAgICAgICAgICAgYW5jaG9yID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zY2FsYXIuYW5jaG9yKQorICAgICAgICBlbGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPT0gWUFNTF9TRVFVRU5DRV9TVEFSVF9FVkVOVCAgICBcCisgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2VxdWVuY2Vfc3RhcnQuYW5jaG9yICE9IE5VTEw6CisgICAgICAgICAgICBhbmNob3IgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNlcXVlbmNlX3N0YXJ0LmFuY2hvcikKKyAgICAgICAgZWxpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlID09IFlBTUxfTUFQUElOR19TVEFSVF9FVkVOVCAgICBcCisgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC5hbmNob3IgIT0gTlVMTDoKKyAgICAgICAgICAgIGFuY2hvciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC5hbmNob3IpCisgICAgICAgIGlmIGFuY2hvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGFuY2hvciBpbiBzZWxmLmFuY2hvcnM6CisgICAgICAgICAgICAgICAgbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBvc2VyRXJyb3IoImZvdW5kIGR1cGxpY2F0ZSBhbmNob3I7IGZpcnN0IG9jY3VyZW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbmNob3JzW2FuY2hvcl0uc3RhcnRfbWFyaywgInNlY29uZCBvY2N1cmVuY2UiLCBtYXJrKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBvc2VyRXJyb3IodSJmb3VuZCBkdXBsaWNhdGUgYW5jaG9yOyBmaXJzdCBvY2N1cmVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYW5jaG9yc1thbmNob3JdLnN0YXJ0X21hcmssIHUic2Vjb25kIG9jY3VyZW5jZSIsIG1hcmspCisgICAgICAgIHNlbGYuZGVzY2VuZF9yZXNvbHZlcihwYXJlbnQsIGluZGV4KQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlID09IFlBTUxfU0NBTEFSX0VWRU5UOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuX2NvbXBvc2Vfc2NhbGFyX25vZGUoYW5jaG9yKQorICAgICAgICBlbGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPT0gWUFNTF9TRVFVRU5DRV9TVEFSVF9FVkVOVDoKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLl9jb21wb3NlX3NlcXVlbmNlX25vZGUoYW5jaG9yKQorICAgICAgICBlbGlmIHNlbGYucGFyc2VkX2V2ZW50LnR5cGUgPT0gWUFNTF9NQVBQSU5HX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuX2NvbXBvc2VfbWFwcGluZ19ub2RlKGFuY2hvcikKKyAgICAgICAgc2VsZi5hc2NlbmRfcmVzb2x2ZXIoKQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgY2RlZiBfY29tcG9zZV9zY2FsYXJfbm9kZShzZWxmLCBvYmplY3QgYW5jaG9yKToKKyAgICAgICAgc3RhcnRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsubGluZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBlbmRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5lbmRfbWFyay5pbmRleCwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5lbmRfbWFyay5saW5lLAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LmVuZF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLnZhbHVlLAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLmxlbmd0aCwgJ3N0cmljdCcpCisgICAgICAgIHBsYWluX2ltcGxpY2l0ID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zY2FsYXIucGxhaW5faW1wbGljaXQgPT0gMToKKyAgICAgICAgICAgIHBsYWluX2ltcGxpY2l0ID0gVHJ1ZQorICAgICAgICBxdW90ZWRfaW1wbGljaXQgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNjYWxhci5xdW90ZWRfaW1wbGljaXQgPT0gMToKKyAgICAgICAgICAgIHF1b3RlZF9pbXBsaWNpdCA9IFRydWUKKyAgICAgICAgaWYgc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zY2FsYXIudGFnID09IE5VTEwgICAgXAorICAgICAgICAgICAgICAgIG9yIChzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNjYWxhci50YWdbMF0gPT0gYychJworICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLnRhZ1sxXSA9PSBjJ1wwJyk6CisgICAgICAgICAgICB0YWcgPSBzZWxmLnJlc29sdmUoU2NhbGFyTm9kZSwgdmFsdWUsIChwbGFpbl9pbXBsaWNpdCwgcXVvdGVkX2ltcGxpY2l0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLnRhZykKKyAgICAgICAgc3R5bGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLnN0eWxlID09IFlBTUxfUExBSU5fU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgc3R5bGUgPSB1JycKKyAgICAgICAgZWxpZiBzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX1NJTkdMRV9RVU9URURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgc3R5bGUgPSB1J1wnJworICAgICAgICBlbGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2NhbGFyLnN0eWxlID09IFlBTUxfRE9VQkxFX1FVT1RFRF9TQ0FMQVJfU1RZTEU6CisgICAgICAgICAgICBzdHlsZSA9IHUnIicKKyAgICAgICAgZWxpZiBzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNjYWxhci5zdHlsZSA9PSBZQU1MX0xJVEVSQUxfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgc3R5bGUgPSB1J3wnCisgICAgICAgIGVsaWYgc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zY2FsYXIuc3R5bGUgPT0gWUFNTF9GT0xERURfU0NBTEFSX1NUWUxFOgorICAgICAgICAgICAgc3R5bGUgPSB1Jz4nCisgICAgICAgIG5vZGUgPSBTY2FsYXJOb2RlKHRhZywgdmFsdWUsIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBzdHlsZSkKKyAgICAgICAgaWYgYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbmNob3JzW2FuY2hvcl0gPSBub2RlCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZzZWxmLnBhcnNlZF9ldmVudCkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGNkZWYgX2NvbXBvc2Vfc2VxdWVuY2Vfbm9kZShzZWxmLCBvYmplY3QgYW5jaG9yKToKKyAgICAgICAgY2RlZiBpbnQgaW5kZXgKKyAgICAgICAgc3RhcnRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsubGluZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBpbXBsaWNpdCA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2VxdWVuY2Vfc3RhcnQuaW1wbGljaXQgPT0gMToKKyAgICAgICAgICAgIGltcGxpY2l0ID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNlcXVlbmNlX3N0YXJ0LnRhZyA9PSBOVUxMICAgIFwKKyAgICAgICAgICAgICAgICBvciAoc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC50YWdbMF0gPT0gYychJworICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2VxdWVuY2Vfc3RhcnQudGFnWzFdID09IGMnXDAnKToKKyAgICAgICAgICAgIHRhZyA9IHNlbGYucmVzb2x2ZShTZXF1ZW5jZU5vZGUsIE5vbmUsIGltcGxpY2l0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFnID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5zZXF1ZW5jZV9zdGFydC50YWcpCisgICAgICAgIGZsb3dfc3R5bGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEuc2VxdWVuY2Vfc3RhcnQuc3R5bGUgPT0gWUFNTF9GTE9XX1NFUVVFTkNFX1NUWUxFOgorICAgICAgICAgICAgZmxvd19zdHlsZSA9IFRydWUKKyAgICAgICAgZWxpZiBzZWxmLnBhcnNlZF9ldmVudC5kYXRhLnNlcXVlbmNlX3N0YXJ0LnN0eWxlID09IFlBTUxfQkxPQ0tfU0VRVUVOQ0VfU1RZTEU6CisgICAgICAgICAgICBmbG93X3N0eWxlID0gRmFsc2UKKyAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICBub2RlID0gU2VxdWVuY2VOb2RlKHRhZywgdmFsdWUsIHN0YXJ0X21hcmssIE5vbmUsIGZsb3dfc3R5bGUpCisgICAgICAgIGlmIGFuY2hvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yc1thbmNob3JdID0gbm9kZQorICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmc2VsZi5wYXJzZWRfZXZlbnQpCisgICAgICAgIGluZGV4ID0gMAorICAgICAgICBzZWxmLl9wYXJzZV9uZXh0X2V2ZW50KCkKKyAgICAgICAgd2hpbGUgc2VsZi5wYXJzZWRfZXZlbnQudHlwZSAhPSBZQU1MX1NFUVVFTkNFX0VORF9FVkVOVDoKKyAgICAgICAgICAgIHZhbHVlLmFwcGVuZChzZWxmLl9jb21wb3NlX25vZGUobm9kZSwgaW5kZXgpKQorICAgICAgICAgICAgaW5kZXggPSBpbmRleCsxCisgICAgICAgICAgICBzZWxmLl9wYXJzZV9uZXh0X2V2ZW50KCkKKyAgICAgICAgbm9kZS5lbmRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5lbmRfbWFyay5pbmRleCwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5lbmRfbWFyay5saW5lLAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LmVuZF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICB5YW1sX2V2ZW50X2RlbGV0ZSgmc2VsZi5wYXJzZWRfZXZlbnQpCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBjZGVmIF9jb21wb3NlX21hcHBpbmdfbm9kZShzZWxmLCBvYmplY3QgYW5jaG9yKToKKyAgICAgICAgc3RhcnRfbWFyayA9IE1hcmsoc2VsZi5zdHJlYW1fbmFtZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LnN0YXJ0X21hcmsubGluZSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlZF9ldmVudC5zdGFydF9tYXJrLmNvbHVtbiwKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorICAgICAgICBpbXBsaWNpdCA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC5pbXBsaWNpdCA9PSAxOgorICAgICAgICAgICAgaW1wbGljaXQgPSBUcnVlCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC50YWcgPT0gTlVMTCAgICBcCisgICAgICAgICAgICAgICAgb3IgKHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC50YWdbMF0gPT0gYychJworICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC50YWdbMV0gPT0gYydcMCcpOgorICAgICAgICAgICAgdGFnID0gc2VsZi5yZXNvbHZlKE1hcHBpbmdOb2RlLCBOb25lLCBpbXBsaWNpdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC50YWcpCisgICAgICAgIGZsb3dfc3R5bGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYucGFyc2VkX2V2ZW50LmRhdGEubWFwcGluZ19zdGFydC5zdHlsZSA9PSBZQU1MX0ZMT1dfTUFQUElOR19TVFlMRToKKyAgICAgICAgICAgIGZsb3dfc3R5bGUgPSBUcnVlCisgICAgICAgIGVsaWYgc2VsZi5wYXJzZWRfZXZlbnQuZGF0YS5tYXBwaW5nX3N0YXJ0LnN0eWxlID09IFlBTUxfQkxPQ0tfTUFQUElOR19TVFlMRToKKyAgICAgICAgICAgIGZsb3dfc3R5bGUgPSBGYWxzZQorICAgICAgICB2YWx1ZSA9IFtdCisgICAgICAgIG5vZGUgPSBNYXBwaW5nTm9kZSh0YWcsIHZhbHVlLCBzdGFydF9tYXJrLCBOb25lLCBmbG93X3N0eWxlKQorICAgICAgICBpZiBhbmNob3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFuY2hvcnNbYW5jaG9yXSA9IG5vZGUKKyAgICAgICAgeWFtbF9ldmVudF9kZWxldGUoJnNlbGYucGFyc2VkX2V2ZW50KQorICAgICAgICBzZWxmLl9wYXJzZV9uZXh0X2V2ZW50KCkKKyAgICAgICAgd2hpbGUgc2VsZi5wYXJzZWRfZXZlbnQudHlwZSAhPSBZQU1MX01BUFBJTkdfRU5EX0VWRU5UOgorICAgICAgICAgICAgaXRlbV9rZXkgPSBzZWxmLl9jb21wb3NlX25vZGUobm9kZSwgTm9uZSkKKyAgICAgICAgICAgIGl0ZW1fdmFsdWUgPSBzZWxmLl9jb21wb3NlX25vZGUobm9kZSwgaXRlbV9rZXkpCisgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoKGl0ZW1fa2V5LCBpdGVtX3ZhbHVlKSkKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlX25leHRfZXZlbnQoKQorICAgICAgICBub2RlLmVuZF9tYXJrID0gTWFyayhzZWxmLnN0cmVhbV9uYW1lLAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LmVuZF9tYXJrLmluZGV4LAorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VkX2V2ZW50LmVuZF9tYXJrLmxpbmUsCisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZWRfZXZlbnQuZW5kX21hcmsuY29sdW1uLAorICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgIHlhbWxfZXZlbnRfZGVsZXRlKCZzZWxmLnBhcnNlZF9ldmVudCkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGNkZWYgaW50IF9wYXJzZV9uZXh0X2V2ZW50KHNlbGYpIGV4Y2VwdCAwOgorICAgICAgICBpZiBzZWxmLnBhcnNlZF9ldmVudC50eXBlID09IFlBTUxfTk9fRVZFTlQ6CisgICAgICAgICAgICBpZiB5YW1sX3BhcnNlcl9wYXJzZSgmc2VsZi5wYXJzZXIsICZzZWxmLnBhcnNlZF9ldmVudCkgPT0gMDoKKyAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX3BhcnNlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgcmV0dXJuIDEKKworY2RlZiBpbnQgaW5wdXRfaGFuZGxlcih2b2lkICpkYXRhLCBjaGFyICpidWZmZXIsIGludCBzaXplLCBpbnQgKnJlYWQpIGV4Y2VwdCAwOgorICAgIGNkZWYgQ1BhcnNlciBwYXJzZXIKKyAgICBwYXJzZXIgPSA8Q1BhcnNlcj5kYXRhCisgICAgaWYgcGFyc2VyLnN0cmVhbV9jYWNoZSBpcyBOb25lOgorICAgICAgICB2YWx1ZSA9IHBhcnNlci5zdHJlYW0ucmVhZChzaXplKQorICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkgIT0gMDoKKyAgICAgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSkKKyAgICAgICAgICAgIHBhcnNlci51bmljb2RlX3NvdXJjZSA9IDEKKyAgICAgICAgaWYgUHlTdHJpbmdfQ2hlY2tFeGFjdCh2YWx1ZSkgPT0gMDoKKyAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYSBzdHJpbmcgdmFsdWUgaXMgZXhwZWN0ZWQiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJhIHN0cmluZyB2YWx1ZSBpcyBleHBlY3RlZCIpCisgICAgICAgIHBhcnNlci5zdHJlYW1fY2FjaGUgPSB2YWx1ZQorICAgICAgICBwYXJzZXIuc3RyZWFtX2NhY2hlX3BvcyA9IDAKKyAgICAgICAgcGFyc2VyLnN0cmVhbV9jYWNoZV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkKKyAgICBpZiAocGFyc2VyLnN0cmVhbV9jYWNoZV9sZW4gLSBwYXJzZXIuc3RyZWFtX2NhY2hlX3BvcykgPCBzaXplOgorICAgICAgICBzaXplID0gcGFyc2VyLnN0cmVhbV9jYWNoZV9sZW4gLSBwYXJzZXIuc3RyZWFtX2NhY2hlX3BvcworICAgIGlmIHNpemUgPiAwOgorICAgICAgICBtZW1jcHkoYnVmZmVyLCBQeVN0cmluZ19BU19TVFJJTkcocGFyc2VyLnN0cmVhbV9jYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcnNlci5zdHJlYW1fY2FjaGVfcG9zLCBzaXplKQorICAgIHJlYWRbMF0gPSBzaXplCisgICAgcGFyc2VyLnN0cmVhbV9jYWNoZV9wb3MgKz0gc2l6ZQorICAgIGlmIHBhcnNlci5zdHJlYW1fY2FjaGVfcG9zID09IHBhcnNlci5zdHJlYW1fY2FjaGVfbGVuOgorICAgICAgICBwYXJzZXIuc3RyZWFtX2NhY2hlID0gTm9uZQorICAgIHJldHVybiAxCisKK2NkZWYgY2xhc3MgQ0VtaXR0ZXI6CisKKyAgICBjZGVmIHlhbWxfZW1pdHRlcl90IGVtaXR0ZXIKKworICAgIGNkZWYgb2JqZWN0IHN0cmVhbQorCisgICAgY2RlZiBpbnQgZG9jdW1lbnRfc3RhcnRfaW1wbGljaXQKKyAgICBjZGVmIGludCBkb2N1bWVudF9lbmRfaW1wbGljaXQKKyAgICBjZGVmIG9iamVjdCB1c2VfdmVyc2lvbgorICAgIGNkZWYgb2JqZWN0IHVzZV90YWdzCisKKyAgICBjZGVmIG9iamVjdCBzZXJpYWxpemVkX25vZGVzCisgICAgY2RlZiBvYmplY3QgYW5jaG9ycworICAgIGNkZWYgaW50IGxhc3RfYWxpYXNfaWQKKyAgICBjZGVmIGludCBjbG9zZWQKKyAgICBjZGVmIGludCBkdW1wX3VuaWNvZGUKKyAgICBjZGVmIG9iamVjdCB1c2VfZW5jb2RpbmcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2luaXRpYWxpemUoJnNlbGYuZW1pdHRlcikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYuZHVtcF91bmljb2RlID0gMAorICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgIGlmIGdldGF0dHIzKHN0cmVhbSwgJ2VuY29kaW5nJywgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5kdW1wX3VuaWNvZGUgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHN0cmVhbSwgdSdlbmNvZGluZycpOgorICAgICAgICAgICAgICAgIHNlbGYuZHVtcF91bmljb2RlID0gMQorICAgICAgICBzZWxmLnVzZV9lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHlhbWxfZW1pdHRlcl9zZXRfb3V0cHV0KCZzZWxmLmVtaXR0ZXIsIG91dHB1dF9oYW5kbGVyLCA8dm9pZCAqPnNlbGYpICAgIAorICAgICAgICBpZiBjYW5vbmljYWw6CisgICAgICAgICAgICB5YW1sX2VtaXR0ZXJfc2V0X2Nhbm9uaWNhbCgmc2VsZi5lbWl0dGVyLCAxKQorICAgICAgICBpZiBpbmRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5YW1sX2VtaXR0ZXJfc2V0X2luZGVudCgmc2VsZi5lbWl0dGVyLCBpbmRlbnQpCisgICAgICAgIGlmIHdpZHRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWFtbF9lbWl0dGVyX3NldF93aWR0aCgmc2VsZi5lbWl0dGVyLCB3aWR0aCkKKyAgICAgICAgaWYgYWxsb3dfdW5pY29kZToKKyAgICAgICAgICAgIHlhbWxfZW1pdHRlcl9zZXRfdW5pY29kZSgmc2VsZi5lbWl0dGVyLCAxKQorICAgICAgICBpZiBsaW5lX2JyZWFrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbGluZV9icmVhayA9PSAnXHInOgorICAgICAgICAgICAgICAgIHlhbWxfZW1pdHRlcl9zZXRfYnJlYWsoJnNlbGYuZW1pdHRlciwgWUFNTF9DUl9CUkVBSykKKyAgICAgICAgICAgIGVsaWYgbGluZV9icmVhayA9PSAnXG4nOgorICAgICAgICAgICAgICAgIHlhbWxfZW1pdHRlcl9zZXRfYnJlYWsoJnNlbGYuZW1pdHRlciwgWUFNTF9MTl9CUkVBSykKKyAgICAgICAgICAgIGVsaWYgbGluZV9icmVhayA9PSAnXHJcbic6CisgICAgICAgICAgICAgICAgeWFtbF9lbWl0dGVyX3NldF9icmVhaygmc2VsZi5lbWl0dGVyLCBZQU1MX0NSTE5fQlJFQUspCisgICAgICAgIHNlbGYuZG9jdW1lbnRfc3RhcnRfaW1wbGljaXQgPSAxCisgICAgICAgIGlmIGV4cGxpY2l0X3N0YXJ0OgorICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9zdGFydF9pbXBsaWNpdCA9IDAKKyAgICAgICAgc2VsZi5kb2N1bWVudF9lbmRfaW1wbGljaXQgPSAxCisgICAgICAgIGlmIGV4cGxpY2l0X2VuZDoKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRfZW5kX2ltcGxpY2l0ID0gMAorICAgICAgICBzZWxmLnVzZV92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLnVzZV90YWdzID0gdGFncworICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXMgPSB7fQorICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorICAgICAgICBzZWxmLmxhc3RfYWxpYXNfaWQgPSAwCisgICAgICAgIHNlbGYuY2xvc2VkID0gLTEKKworICAgIGRlZiBfX2RlYWxsb2NfXyhzZWxmKToKKyAgICAgICAgeWFtbF9lbWl0dGVyX2RlbGV0ZSgmc2VsZi5lbWl0dGVyKQorCisgICAgZGVmIGRpc3Bvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGNkZWYgb2JqZWN0IF9lbWl0dGVyX2Vycm9yKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVtaXR0ZXIuZXJyb3IgPT0gWUFNTF9NRU1PUllfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gTWVtb3J5RXJyb3IKKyAgICAgICAgZWxpZiBzZWxmLmVtaXR0ZXIuZXJyb3IgPT0gWUFNTF9FTUlUVEVSX0VSUk9SOgorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcHJvYmxlbSA9IHNlbGYuZW1pdHRlci5wcm9ibGVtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByb2JsZW0gPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhzZWxmLmVtaXR0ZXIucHJvYmxlbSkKKyAgICAgICAgICAgIHJldHVybiBFbWl0dGVyRXJyb3IocHJvYmxlbSkKKyAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBlbWl0dGVyIGVycm9yIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IodSJubyBlbWl0dGVyIGVycm9yIikKKworICAgIGNkZWYgaW50IF9vYmplY3RfdG9fZXZlbnQoc2VsZiwgb2JqZWN0IGV2ZW50X29iamVjdCwgeWFtbF9ldmVudF90ICpldmVudCkgZXhjZXB0IDA6CisgICAgICAgIGNkZWYgeWFtbF9lbmNvZGluZ190IGVuY29kaW5nCisgICAgICAgIGNkZWYgeWFtbF92ZXJzaW9uX2RpcmVjdGl2ZV90IHZlcnNpb25fZGlyZWN0aXZlX3ZhbHVlCisgICAgICAgIGNkZWYgeWFtbF92ZXJzaW9uX2RpcmVjdGl2ZV90ICp2ZXJzaW9uX2RpcmVjdGl2ZQorICAgICAgICBjZGVmIHlhbWxfdGFnX2RpcmVjdGl2ZV90IHRhZ19kaXJlY3RpdmVzX3ZhbHVlWzEyOF0KKyAgICAgICAgY2RlZiB5YW1sX3RhZ19kaXJlY3RpdmVfdCAqdGFnX2RpcmVjdGl2ZXNfc3RhcnQKKyAgICAgICAgY2RlZiB5YW1sX3RhZ19kaXJlY3RpdmVfdCAqdGFnX2RpcmVjdGl2ZXNfZW5kCisgICAgICAgIGNkZWYgaW50IGltcGxpY2l0CisgICAgICAgIGNkZWYgaW50IHBsYWluX2ltcGxpY2l0CisgICAgICAgIGNkZWYgaW50IHF1b3RlZF9pbXBsaWNpdAorICAgICAgICBjZGVmIGNoYXIgKmFuY2hvcgorICAgICAgICBjZGVmIGNoYXIgKnRhZworICAgICAgICBjZGVmIGNoYXIgKnZhbHVlCisgICAgICAgIGNkZWYgaW50IGxlbmd0aAorICAgICAgICBjZGVmIHlhbWxfc2NhbGFyX3N0eWxlX3Qgc2NhbGFyX3N0eWxlCisgICAgICAgIGNkZWYgeWFtbF9zZXF1ZW5jZV9zdHlsZV90IHNlcXVlbmNlX3N0eWxlCisgICAgICAgIGNkZWYgeWFtbF9tYXBwaW5nX3N0eWxlX3QgbWFwcGluZ19zdHlsZQorICAgICAgICBldmVudF9jbGFzcyA9IGV2ZW50X29iamVjdC5fX2NsYXNzX18KKyAgICAgICAgaWYgZXZlbnRfY2xhc3MgaXMgU3RyZWFtU3RhcnRFdmVudDoKKyAgICAgICAgICAgIGVuY29kaW5nID0gWUFNTF9VVEY4X0VOQ09ESU5HCisgICAgICAgICAgICBpZiBldmVudF9vYmplY3QuZW5jb2RpbmcgPT0gdSd1dGYtMTYtbGUnIG9yIGV2ZW50X29iamVjdC5lbmNvZGluZyA9PSAndXRmLTE2LWxlJzoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFlBTUxfVVRGMTZMRV9FTkNPRElORworICAgICAgICAgICAgZWxpZiBldmVudF9vYmplY3QuZW5jb2RpbmcgPT0gdSd1dGYtMTYtYmUnIG9yIGV2ZW50X29iamVjdC5lbmNvZGluZyA9PSAndXRmLTE2LWJlJzoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFlBTUxfVVRGMTZCRV9FTkNPRElORworICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LmVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5kdW1wX3VuaWNvZGUgPSAxCisgICAgICAgICAgICBpZiBzZWxmLmR1bXBfdW5pY29kZSA9PSAxOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gWUFNTF9VVEY4X0VOQ09ESU5HCisgICAgICAgICAgICB5YW1sX3N0cmVhbV9zdGFydF9ldmVudF9pbml0aWFsaXplKGV2ZW50LCBlbmNvZGluZykKKyAgICAgICAgZWxpZiBldmVudF9jbGFzcyBpcyBTdHJlYW1FbmRFdmVudDoKKyAgICAgICAgICAgIHlhbWxfc3RyZWFtX2VuZF9ldmVudF9pbml0aWFsaXplKGV2ZW50KQorICAgICAgICBlbGlmIGV2ZW50X2NsYXNzIGlzIERvY3VtZW50U3RhcnRFdmVudDoKKyAgICAgICAgICAgIHZlcnNpb25fZGlyZWN0aXZlID0gTlVMTAorICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LnZlcnNpb246CisgICAgICAgICAgICAgICAgdmVyc2lvbl9kaXJlY3RpdmVfdmFsdWUubWFqb3IgPSBldmVudF9vYmplY3QudmVyc2lvblswXQorICAgICAgICAgICAgICAgIHZlcnNpb25fZGlyZWN0aXZlX3ZhbHVlLm1pbm9yID0gZXZlbnRfb2JqZWN0LnZlcnNpb25bMV0KKyAgICAgICAgICAgICAgICB2ZXJzaW9uX2RpcmVjdGl2ZSA9ICZ2ZXJzaW9uX2RpcmVjdGl2ZV92YWx1ZQorICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfc3RhcnQgPSBOVUxMCisgICAgICAgICAgICB0YWdfZGlyZWN0aXZlc19lbmQgPSBOVUxMCisgICAgICAgICAgICBpZiBldmVudF9vYmplY3QudGFnczoKKyAgICAgICAgICAgICAgICBpZiBsZW4oZXZlbnRfb2JqZWN0LnRhZ3MpID4gMTI4OgorICAgICAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRvbyBtYW55IHRhZ3MiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih1InRvbyBtYW55IHRhZ3MiKQorICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmVzX3N0YXJ0ID0gdGFnX2RpcmVjdGl2ZXNfdmFsdWUKKyAgICAgICAgICAgICAgICB0YWdfZGlyZWN0aXZlc19lbmQgPSB0YWdfZGlyZWN0aXZlc192YWx1ZQorICAgICAgICAgICAgICAgIGNhY2hlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaGFuZGxlIGluIGV2ZW50X29iamVjdC50YWdzOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBldmVudF9vYmplY3QudGFnc1toYW5kbGVdCisgICAgICAgICAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KGhhbmRsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLmFwcGVuZChoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBQeVN0cmluZ19DaGVja0V4YWN0KGhhbmRsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRhZyBoYW5kbGUgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InRhZyBoYW5kbGUgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmVzX2VuZC5oYW5kbGUgPSBQeVN0cmluZ19BU19TVFJJTkcoaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChwcmVmaXgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdChwcmVmaXgpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0YWcgcHJlZml4IG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJ0YWcgcHJlZml4IG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICB0YWdfZGlyZWN0aXZlc19lbmQucHJlZml4ID0gUHlTdHJpbmdfQVNfU1RSSU5HKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfZW5kID0gdGFnX2RpcmVjdGl2ZXNfZW5kKzEKKyAgICAgICAgICAgIGltcGxpY2l0ID0gMQorICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LmV4cGxpY2l0OgorICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gMAorICAgICAgICAgICAgaWYgeWFtbF9kb2N1bWVudF9zdGFydF9ldmVudF9pbml0aWFsaXplKGV2ZW50LCB2ZXJzaW9uX2RpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfc3RhcnQsIHRhZ19kaXJlY3RpdmVzX2VuZCwgaW1wbGljaXQpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgTWVtb3J5RXJyb3IKKyAgICAgICAgZWxpZiBldmVudF9jbGFzcyBpcyBEb2N1bWVudEVuZEV2ZW50OgorICAgICAgICAgICAgaW1wbGljaXQgPSAxCisgICAgICAgICAgICBpZiBldmVudF9vYmplY3QuZXhwbGljaXQ6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAwCisgICAgICAgICAgICB5YW1sX2RvY3VtZW50X2VuZF9ldmVudF9pbml0aWFsaXplKGV2ZW50LCBpbXBsaWNpdCkKKyAgICAgICAgZWxpZiBldmVudF9jbGFzcyBpcyBBbGlhc0V2ZW50OgorICAgICAgICAgICAgYW5jaG9yID0gTlVMTAorICAgICAgICAgICAgYW5jaG9yX29iamVjdCA9IGV2ZW50X29iamVjdC5hbmNob3IKKyAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KGFuY2hvcl9vYmplY3QpOgorICAgICAgICAgICAgICAgIGFuY2hvcl9vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdChhbmNob3Jfb2JqZWN0KToKKyAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbmNob3IgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKHUiYW5jaG9yIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgYW5jaG9yID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICBpZiB5YW1sX2FsaWFzX2V2ZW50X2luaXRpYWxpemUoZXZlbnQsIGFuY2hvcikgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBNZW1vcnlFcnJvcgorICAgICAgICBlbGlmIGV2ZW50X2NsYXNzIGlzIFNjYWxhckV2ZW50OgorICAgICAgICAgICAgYW5jaG9yID0gTlVMTAorICAgICAgICAgICAgYW5jaG9yX29iamVjdCA9IGV2ZW50X29iamVjdC5hbmNob3IKKyAgICAgICAgICAgIGlmIGFuY2hvcl9vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QoYW5jaG9yX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGFuY2hvcl9vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QoYW5jaG9yX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbmNob3IgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJhbmNob3IgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgYW5jaG9yID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICB0YWcgPSBOVUxMCisgICAgICAgICAgICB0YWdfb2JqZWN0ID0gZXZlbnRfb2JqZWN0LnRhZworICAgICAgICAgICAgaWYgdGFnX29iamVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgdGFnX29iamVjdCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodGFnX29iamVjdCkKKyAgICAgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICB0YWcgPSBQeVN0cmluZ19BU19TVFJJTkcodGFnX29iamVjdCkKKyAgICAgICAgICAgIHZhbHVlX29iamVjdCA9IGV2ZW50X29iamVjdC52YWx1ZQorICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QodmFsdWVfb2JqZWN0KToKKyAgICAgICAgICAgICAgICB2YWx1ZV9vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHZhbHVlX29iamVjdCkKKyAgICAgICAgICAgIGlmIG5vdCBQeVN0cmluZ19DaGVja0V4YWN0KHZhbHVlX29iamVjdCk6CisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidmFsdWUgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKHUidmFsdWUgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICB2YWx1ZSA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZV9vYmplY3QpCisgICAgICAgICAgICBsZW5ndGggPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZV9vYmplY3QpCisgICAgICAgICAgICBwbGFpbl9pbXBsaWNpdCA9IDAKKyAgICAgICAgICAgIHF1b3RlZF9pbXBsaWNpdCA9IDAKKyAgICAgICAgICAgIGlmIGV2ZW50X29iamVjdC5pbXBsaWNpdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwbGFpbl9pbXBsaWNpdCA9IGV2ZW50X29iamVjdC5pbXBsaWNpdFswXQorICAgICAgICAgICAgICAgIHF1b3RlZF9pbXBsaWNpdCA9IGV2ZW50X29iamVjdC5pbXBsaWNpdFsxXQorICAgICAgICAgICAgc3R5bGVfb2JqZWN0ID0gZXZlbnRfb2JqZWN0LnN0eWxlCisgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX1BMQUlOX1NDQUxBUl9TVFlMRQorICAgICAgICAgICAgaWYgc3R5bGVfb2JqZWN0ID09ICInIiBvciBzdHlsZV9vYmplY3QgPT0gdSInIjoKKyAgICAgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX1NJTkdMRV9RVU9URURfU0NBTEFSX1NUWUxFCisgICAgICAgICAgICBlbGlmIHN0eWxlX29iamVjdCA9PSAiXCIiIG9yIHN0eWxlX29iamVjdCA9PSB1IlwiIjoKKyAgICAgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX0RPVUJMRV9RVU9URURfU0NBTEFSX1NUWUxFCisgICAgICAgICAgICBlbGlmIHN0eWxlX29iamVjdCA9PSAifCIgb3Igc3R5bGVfb2JqZWN0ID09IHUifCI6CisgICAgICAgICAgICAgICAgc2NhbGFyX3N0eWxlID0gWUFNTF9MSVRFUkFMX1NDQUxBUl9TVFlMRQorICAgICAgICAgICAgZWxpZiBzdHlsZV9vYmplY3QgPT0gIj4iIG9yIHN0eWxlX29iamVjdCA9PSB1Ij4iOgorICAgICAgICAgICAgICAgIHNjYWxhcl9zdHlsZSA9IFlBTUxfRk9MREVEX1NDQUxBUl9TVFlMRQorICAgICAgICAgICAgaWYgeWFtbF9zY2FsYXJfZXZlbnRfaW5pdGlhbGl6ZShldmVudCwgYW5jaG9yLCB0YWcsIHZhbHVlLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHBsYWluX2ltcGxpY2l0LCBxdW90ZWRfaW1wbGljaXQsIHNjYWxhcl9zdHlsZSkgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBNZW1vcnlFcnJvcgorICAgICAgICBlbGlmIGV2ZW50X2NsYXNzIGlzIFNlcXVlbmNlU3RhcnRFdmVudDoKKyAgICAgICAgICAgIGFuY2hvciA9IE5VTEwKKyAgICAgICAgICAgIGFuY2hvcl9vYmplY3QgPSBldmVudF9vYmplY3QuYW5jaG9yCisgICAgICAgICAgICBpZiBhbmNob3Jfb2JqZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KGFuY2hvcl9vYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBhbmNob3Jfb2JqZWN0ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhhbmNob3Jfb2JqZWN0KQorICAgICAgICAgICAgICAgIGlmIG5vdCBQeVN0cmluZ19DaGVja0V4YWN0KGFuY2hvcl9vYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYW5jaG9yIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKHUiYW5jaG9yIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgIGFuY2hvciA9IFB5U3RyaW5nX0FTX1NUUklORyhhbmNob3Jfb2JqZWN0KQorICAgICAgICAgICAgdGFnID0gTlVMTAorICAgICAgICAgICAgdGFnX29iamVjdCA9IGV2ZW50X29iamVjdC50YWcKKyAgICAgICAgICAgIGlmIHRhZ19vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QodGFnX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIHRhZ19vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHRhZ19vYmplY3QpCisgICAgICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QodGFnX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0YWcgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJ0YWcgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgdGFnID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRhZ19vYmplY3QpCisgICAgICAgICAgICBpbXBsaWNpdCA9IDAKKyAgICAgICAgICAgIGlmIGV2ZW50X29iamVjdC5pbXBsaWNpdDoKKyAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IDEKKyAgICAgICAgICAgIHNlcXVlbmNlX3N0eWxlID0gWUFNTF9CTE9DS19TRVFVRU5DRV9TVFlMRQorICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LmZsb3dfc3R5bGU6CisgICAgICAgICAgICAgICAgc2VxdWVuY2Vfc3R5bGUgPSBZQU1MX0ZMT1dfU0VRVUVOQ0VfU1RZTEUKKyAgICAgICAgICAgIGlmIHlhbWxfc2VxdWVuY2Vfc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZShldmVudCwgYW5jaG9yLCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0LCBzZXF1ZW5jZV9zdHlsZSkgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBNZW1vcnlFcnJvcgorICAgICAgICBlbGlmIGV2ZW50X2NsYXNzIGlzIE1hcHBpbmdTdGFydEV2ZW50OgorICAgICAgICAgICAgYW5jaG9yID0gTlVMTAorICAgICAgICAgICAgYW5jaG9yX29iamVjdCA9IGV2ZW50X29iamVjdC5hbmNob3IKKyAgICAgICAgICAgIGlmIGFuY2hvcl9vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QoYW5jaG9yX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGFuY2hvcl9vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QoYW5jaG9yX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbmNob3IgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJhbmNob3IgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgYW5jaG9yID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFuY2hvcl9vYmplY3QpCisgICAgICAgICAgICB0YWcgPSBOVUxMCisgICAgICAgICAgICB0YWdfb2JqZWN0ID0gZXZlbnRfb2JqZWN0LnRhZworICAgICAgICAgICAgaWYgdGFnX29iamVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgdGFnX29iamVjdCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodGFnX29iamVjdCkKKyAgICAgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICB0YWcgPSBQeVN0cmluZ19BU19TVFJJTkcodGFnX29iamVjdCkKKyAgICAgICAgICAgIGltcGxpY2l0ID0gMAorICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LmltcGxpY2l0OgorICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gMQorICAgICAgICAgICAgbWFwcGluZ19zdHlsZSA9IFlBTUxfQkxPQ0tfTUFQUElOR19TVFlMRQorICAgICAgICAgICAgaWYgZXZlbnRfb2JqZWN0LmZsb3dfc3R5bGU6CisgICAgICAgICAgICAgICAgbWFwcGluZ19zdHlsZSA9IFlBTUxfRkxPV19NQVBQSU5HX1NUWUxFCisgICAgICAgICAgICBpZiB5YW1sX21hcHBpbmdfc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZShldmVudCwgYW5jaG9yLCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0LCBtYXBwaW5nX3N0eWxlKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgIGVsaWYgZXZlbnRfY2xhc3MgaXMgU2VxdWVuY2VFbmRFdmVudDoKKyAgICAgICAgICAgIHlhbWxfc2VxdWVuY2VfZW5kX2V2ZW50X2luaXRpYWxpemUoZXZlbnQpCisgICAgICAgIGVsaWYgZXZlbnRfY2xhc3MgaXMgTWFwcGluZ0VuZEV2ZW50OgorICAgICAgICAgICAgeWFtbF9tYXBwaW5nX2VuZF9ldmVudF9pbml0aWFsaXplKGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGV2ZW50ICVzIiAlIGV2ZW50X29iamVjdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKHUiaW52YWxpZCBldmVudCAlcyIgJSBldmVudF9vYmplY3QpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgZW1pdChzZWxmLCBldmVudF9vYmplY3QpOgorICAgICAgICBjZGVmIHlhbWxfZXZlbnRfdCBldmVudAorICAgICAgICBzZWxmLl9vYmplY3RfdG9fZXZlbnQoZXZlbnRfb2JqZWN0LCAmZXZlbnQpCisgICAgICAgIGlmIHlhbWxfZW1pdHRlcl9lbWl0KCZzZWxmLmVtaXR0ZXIsICZldmVudCkgPT0gMDoKKyAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICByYWlzZSBlcnJvcgorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGNkZWYgeWFtbF9ldmVudF90IGV2ZW50CisgICAgICAgIGNkZWYgeWFtbF9lbmNvZGluZ190IGVuY29kaW5nCisgICAgICAgIGlmIHNlbGYuY2xvc2VkID09IC0xOgorICAgICAgICAgICAgaWYgc2VsZi51c2VfZW5jb2RpbmcgPT0gdSd1dGYtMTYtbGUnIG9yIHNlbGYudXNlX2VuY29kaW5nID09ICd1dGYtMTYtbGUnOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gWUFNTF9VVEYxNkxFX0VOQ09ESU5HCisgICAgICAgICAgICBlbGlmIHNlbGYudXNlX2VuY29kaW5nID09IHUndXRmLTE2LWJlJyBvciBzZWxmLnVzZV9lbmNvZGluZyA9PSAndXRmLTE2LWJlJzoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFlBTUxfVVRGMTZCRV9FTkNPRElORworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFlBTUxfVVRGOF9FTkNPRElORworICAgICAgICAgICAgaWYgc2VsZi51c2VfZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmR1bXBfdW5pY29kZSA9IDEKKyAgICAgICAgICAgIGlmIHNlbGYuZHVtcF91bmljb2RlID09IDE6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBZQU1MX1VURjhfRU5DT0RJTkcKKyAgICAgICAgICAgIHlhbWxfc3RyZWFtX3N0YXJ0X2V2ZW50X2luaXRpYWxpemUoJmV2ZW50LCBlbmNvZGluZykKKyAgICAgICAgICAgIGlmIHlhbWxfZW1pdHRlcl9lbWl0KCZzZWxmLmVtaXR0ZXIsICZldmVudCkgPT0gMDoKKyAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX2VtaXR0ZXJfZXJyb3IoKQorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IDAKKyAgICAgICAgZWxpZiBzZWxmLmNsb3NlZCA9PSAxOgorICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKCJzZXJpYWxpemVyIGlzIGNsb3NlZCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcih1InNlcmlhbGl6ZXIgaXMgY2xvc2VkIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcigic2VyaWFsaXplciBpcyBhbHJlYWR5IG9wZW5lZCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcih1InNlcmlhbGl6ZXIgaXMgYWxyZWFkeSBvcGVuZWQiKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBjZGVmIHlhbWxfZXZlbnRfdCBldmVudAorICAgICAgICBpZiBzZWxmLmNsb3NlZCA9PSAtMToKKyAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcigic2VyaWFsaXplciBpcyBub3Qgb3BlbmVkIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKHUic2VyaWFsaXplciBpcyBub3Qgb3BlbmVkIikKKyAgICAgICAgZWxpZiBzZWxmLmNsb3NlZCA9PSAwOgorICAgICAgICAgICAgeWFtbF9zdHJlYW1fZW5kX2V2ZW50X2luaXRpYWxpemUoJmV2ZW50KQorICAgICAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2VtaXQoJnNlbGYuZW1pdHRlciwgJmV2ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMQorCisgICAgZGVmIHNlcmlhbGl6ZShzZWxmLCBub2RlKToKKyAgICAgICAgY2RlZiB5YW1sX2V2ZW50X3QgZXZlbnQKKyAgICAgICAgY2RlZiB5YW1sX3ZlcnNpb25fZGlyZWN0aXZlX3QgdmVyc2lvbl9kaXJlY3RpdmVfdmFsdWUKKyAgICAgICAgY2RlZiB5YW1sX3ZlcnNpb25fZGlyZWN0aXZlX3QgKnZlcnNpb25fZGlyZWN0aXZlCisgICAgICAgIGNkZWYgeWFtbF90YWdfZGlyZWN0aXZlX3QgdGFnX2RpcmVjdGl2ZXNfdmFsdWVbMTI4XQorICAgICAgICBjZGVmIHlhbWxfdGFnX2RpcmVjdGl2ZV90ICp0YWdfZGlyZWN0aXZlc19zdGFydAorICAgICAgICBjZGVmIHlhbWxfdGFnX2RpcmVjdGl2ZV90ICp0YWdfZGlyZWN0aXZlc19lbmQKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQgPT0gLTE6CisgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgbm90IG9wZW5lZCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcih1InNlcmlhbGl6ZXIgaXMgbm90IG9wZW5lZCIpCisgICAgICAgIGVsaWYgc2VsZi5jbG9zZWQgPT0gMToKKyAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFNlcmlhbGl6ZXJFcnJvcigic2VyaWFsaXplciBpcyBjbG9zZWQiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IodSJzZXJpYWxpemVyIGlzIGNsb3NlZCIpCisgICAgICAgIGNhY2hlID0gW10KKyAgICAgICAgdmVyc2lvbl9kaXJlY3RpdmUgPSBOVUxMCisgICAgICAgIGlmIHNlbGYudXNlX3ZlcnNpb246CisgICAgICAgICAgICB2ZXJzaW9uX2RpcmVjdGl2ZV92YWx1ZS5tYWpvciA9IHNlbGYudXNlX3ZlcnNpb25bMF0KKyAgICAgICAgICAgIHZlcnNpb25fZGlyZWN0aXZlX3ZhbHVlLm1pbm9yID0gc2VsZi51c2VfdmVyc2lvblsxXQorICAgICAgICAgICAgdmVyc2lvbl9kaXJlY3RpdmUgPSAmdmVyc2lvbl9kaXJlY3RpdmVfdmFsdWUKKyAgICAgICAgdGFnX2RpcmVjdGl2ZXNfc3RhcnQgPSBOVUxMCisgICAgICAgIHRhZ19kaXJlY3RpdmVzX2VuZCA9IE5VTEwKKyAgICAgICAgaWYgc2VsZi51c2VfdGFnczoKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLnVzZV90YWdzKSA+IDEyODoKKyAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidG9vIG1hbnkgdGFncyIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih1InRvbyBtYW55IHRhZ3MiKQorICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfc3RhcnQgPSB0YWdfZGlyZWN0aXZlc192YWx1ZQorICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfZW5kID0gdGFnX2RpcmVjdGl2ZXNfdmFsdWUKKyAgICAgICAgICAgIGZvciBoYW5kbGUgaW4gc2VsZi51c2VfdGFnczoKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBzZWxmLnVzZV90YWdzW2hhbmRsZV0KKyAgICAgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChoYW5kbGUpOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUuYXBwZW5kKGhhbmRsZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdChoYW5kbGUpOgorICAgICAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGFnIGhhbmRsZSBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InRhZyBoYW5kbGUgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgdGFnX2RpcmVjdGl2ZXNfZW5kLmhhbmRsZSA9IFB5U3RyaW5nX0FTX1NUUklORyhoYW5kbGUpCisgICAgICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QocHJlZml4KToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIGNhY2hlLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QocHJlZml4KToKKyAgICAgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRhZyBwcmVmaXggbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJ0YWcgcHJlZml4IG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmVzX2VuZC5wcmVmaXggPSBQeVN0cmluZ19BU19TVFJJTkcocHJlZml4KQorICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmVzX2VuZCA9IHRhZ19kaXJlY3RpdmVzX2VuZCsxCisgICAgICAgIGlmIHlhbWxfZG9jdW1lbnRfc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZSgmZXZlbnQsIHZlcnNpb25fZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgIHRhZ19kaXJlY3RpdmVzX3N0YXJ0LCB0YWdfZGlyZWN0aXZlc19lbmQsCisgICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9zdGFydF9pbXBsaWNpdCkgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgIGlmIHlhbWxfZW1pdHRlcl9lbWl0KCZzZWxmLmVtaXR0ZXIsICZldmVudCkgPT0gMDoKKyAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICBzZWxmLl9hbmNob3Jfbm9kZShub2RlKQorICAgICAgICBzZWxmLl9zZXJpYWxpemVfbm9kZShub2RlLCBOb25lLCBOb25lKQorICAgICAgICB5YW1sX2RvY3VtZW50X2VuZF9ldmVudF9pbml0aWFsaXplKCZldmVudCwgc2VsZi5kb2N1bWVudF9lbmRfaW1wbGljaXQpCisgICAgICAgIGlmIHlhbWxfZW1pdHRlcl9lbWl0KCZzZWxmLmVtaXR0ZXIsICZldmVudCkgPT0gMDoKKyAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXMgPSB7fQorICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorICAgICAgICBzZWxmLmxhc3RfYWxpYXNfaWQgPSAwCisKKyAgICBjZGVmIGludCBfYW5jaG9yX25vZGUoc2VsZiwgb2JqZWN0IG5vZGUpIGV4Y2VwdCAwOgorICAgICAgICBpZiBub2RlIGluIHNlbGYuYW5jaG9yczoKKyAgICAgICAgICAgIGlmIHNlbGYuYW5jaG9yc1tub2RlXSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdF9hbGlhc19pZCA9IHNlbGYubGFzdF9hbGlhc19pZCsxCisgICAgICAgICAgICAgICAgc2VsZi5hbmNob3JzW25vZGVdID0gdSJpZCUwM2QiICUgc2VsZi5sYXN0X2FsaWFzX2lkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFuY2hvcnNbbm9kZV0gPSBOb25lCisgICAgICAgICAgICBub2RlX2NsYXNzID0gbm9kZS5fX2NsYXNzX18KKyAgICAgICAgICAgIGlmIG5vZGVfY2xhc3MgaXMgU2VxdWVuY2VOb2RlOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FuY2hvcl9ub2RlKGl0ZW0pCisgICAgICAgICAgICBlbGlmIG5vZGVfY2xhc3MgaXMgTWFwcGluZ05vZGU6CisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYW5jaG9yX25vZGUoa2V5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9hbmNob3Jfbm9kZSh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGNkZWYgaW50IF9zZXJpYWxpemVfbm9kZShzZWxmLCBvYmplY3Qgbm9kZSwgb2JqZWN0IHBhcmVudCwgb2JqZWN0IGluZGV4KSBleGNlcHQgMDoKKyAgICAgICAgY2RlZiB5YW1sX2V2ZW50X3QgZXZlbnQKKyAgICAgICAgY2RlZiBpbnQgaW1wbGljaXQKKyAgICAgICAgY2RlZiBpbnQgcGxhaW5faW1wbGljaXQKKyAgICAgICAgY2RlZiBpbnQgcXVvdGVkX2ltcGxpY2l0CisgICAgICAgIGNkZWYgY2hhciAqYW5jaG9yCisgICAgICAgIGNkZWYgY2hhciAqdGFnCisgICAgICAgIGNkZWYgY2hhciAqdmFsdWUKKyAgICAgICAgY2RlZiBpbnQgbGVuZ3RoCisgICAgICAgIGNkZWYgaW50IGl0ZW1faW5kZXgKKyAgICAgICAgY2RlZiB5YW1sX3NjYWxhcl9zdHlsZV90IHNjYWxhcl9zdHlsZQorICAgICAgICBjZGVmIHlhbWxfc2VxdWVuY2Vfc3R5bGVfdCBzZXF1ZW5jZV9zdHlsZQorICAgICAgICBjZGVmIHlhbWxfbWFwcGluZ19zdHlsZV90IG1hcHBpbmdfc3R5bGUKKyAgICAgICAgYW5jaG9yX29iamVjdCA9IHNlbGYuYW5jaG9yc1tub2RlXQorICAgICAgICBhbmNob3IgPSBOVUxMCisgICAgICAgIGlmIGFuY2hvcl9vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChhbmNob3Jfb2JqZWN0KToKKyAgICAgICAgICAgICAgICBhbmNob3Jfb2JqZWN0ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhhbmNob3Jfb2JqZWN0KQorICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QoYW5jaG9yX29iamVjdCk6CisgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYW5jaG9yIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1ImFuY2hvciBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgIGFuY2hvciA9IFB5U3RyaW5nX0FTX1NUUklORyhhbmNob3Jfb2JqZWN0KQorICAgICAgICBpZiBub2RlIGluIHNlbGYuc2VyaWFsaXplZF9ub2RlczoKKyAgICAgICAgICAgIGlmIHlhbWxfYWxpYXNfZXZlbnRfaW5pdGlhbGl6ZSgmZXZlbnQsIGFuY2hvcikgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBNZW1vcnlFcnJvcgorICAgICAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2VtaXQoJnNlbGYuZW1pdHRlciwgJmV2ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vZGVfY2xhc3MgPSBub2RlLl9fY2xhc3NfXworICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVkX25vZGVzW25vZGVdID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5kZXNjZW5kX3Jlc29sdmVyKHBhcmVudCwgaW5kZXgpCisgICAgICAgICAgICBpZiBub2RlX2NsYXNzIGlzIFNjYWxhck5vZGU6CisgICAgICAgICAgICAgICAgcGxhaW5faW1wbGljaXQgPSAwCisgICAgICAgICAgICAgICAgcXVvdGVkX2ltcGxpY2l0ID0gMAorICAgICAgICAgICAgICAgIHRhZ19vYmplY3QgPSBub2RlLnRhZworICAgICAgICAgICAgICAgIGlmIHNlbGYucmVzb2x2ZShTY2FsYXJOb2RlLCBub2RlLnZhbHVlLCAoVHJ1ZSwgRmFsc2UpKSA9PSB0YWdfb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICBwbGFpbl9pbXBsaWNpdCA9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJlc29sdmUoU2NhbGFyTm9kZSwgbm9kZS52YWx1ZSwgKEZhbHNlLCBUcnVlKSkgPT0gdGFnX29iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVkX2ltcGxpY2l0ID0gMQorICAgICAgICAgICAgICAgIHRhZyA9IE5VTEwKKyAgICAgICAgICAgICAgICBpZiB0YWdfb2JqZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19vYmplY3QgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHRhZ19vYmplY3QpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBQeVN0cmluZ19DaGVja0V4YWN0KHRhZ19vYmplY3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0YWcgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgdGFnID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRhZ19vYmplY3QpCisgICAgICAgICAgICAgICAgdmFsdWVfb2JqZWN0ID0gbm9kZS52YWx1ZQorICAgICAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX29iamVjdCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodmFsdWVfb2JqZWN0KQorICAgICAgICAgICAgICAgIGlmIG5vdCBQeVN0cmluZ19DaGVja0V4YWN0KHZhbHVlX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcih1InZhbHVlIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgIHZhbHVlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlX29iamVjdCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZV9vYmplY3QpCisgICAgICAgICAgICAgICAgc3R5bGVfb2JqZWN0ID0gbm9kZS5zdHlsZQorICAgICAgICAgICAgICAgIHNjYWxhcl9zdHlsZSA9IFlBTUxfUExBSU5fU0NBTEFSX1NUWUxFCisgICAgICAgICAgICAgICAgaWYgc3R5bGVfb2JqZWN0ID09ICInIiBvciBzdHlsZV9vYmplY3QgPT0gdSInIjoKKyAgICAgICAgICAgICAgICAgICAgc2NhbGFyX3N0eWxlID0gWUFNTF9TSU5HTEVfUVVPVEVEX1NDQUxBUl9TVFlMRQorICAgICAgICAgICAgICAgIGVsaWYgc3R5bGVfb2JqZWN0ID09ICJcIiIgb3Igc3R5bGVfb2JqZWN0ID09IHUiXCIiOgorICAgICAgICAgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX0RPVUJMRV9RVU9URURfU0NBTEFSX1NUWUxFCisgICAgICAgICAgICAgICAgZWxpZiBzdHlsZV9vYmplY3QgPT0gInwiIG9yIHN0eWxlX29iamVjdCA9PSB1InwiOgorICAgICAgICAgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX0xJVEVSQUxfU0NBTEFSX1NUWUxFCisgICAgICAgICAgICAgICAgZWxpZiBzdHlsZV9vYmplY3QgPT0gIj4iIG9yIHN0eWxlX29iamVjdCA9PSB1Ij4iOgorICAgICAgICAgICAgICAgICAgICBzY2FsYXJfc3R5bGUgPSBZQU1MX0ZPTERFRF9TQ0FMQVJfU1RZTEUKKyAgICAgICAgICAgICAgICBpZiB5YW1sX3NjYWxhcl9ldmVudF9pbml0aWFsaXplKCZldmVudCwgYW5jaG9yLCB0YWcsIHZhbHVlLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbl9pbXBsaWNpdCwgcXVvdGVkX2ltcGxpY2l0LCBzY2FsYXJfc3R5bGUpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgICAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2VtaXQoJnNlbGYuZW1pdHRlciwgJmV2ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX2VtaXR0ZXJfZXJyb3IoKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICAgICAgZWxpZiBub2RlX2NsYXNzIGlzIFNlcXVlbmNlTm9kZToKKyAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IDAKKyAgICAgICAgICAgICAgICB0YWdfb2JqZWN0ID0gbm9kZS50YWcKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJlc29sdmUoU2VxdWVuY2VOb2RlLCBub2RlLnZhbHVlLCBUcnVlKSA9PSB0YWdfb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IDEKKyAgICAgICAgICAgICAgICB0YWcgPSBOVUxMCisgICAgICAgICAgICAgICAgaWYgdGFnX29iamVjdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgUHlVbmljb2RlX0NoZWNrRXhhY3QodGFnX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWdfb2JqZWN0ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh0YWdfb2JqZWN0KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgUHlTdHJpbmdfQ2hlY2tFeGFjdCh0YWdfb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFBZX01BSk9SX1ZFUlNJT04gPCAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGFnIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodSJ0YWcgbXVzdCBiZSBhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgICAgIHRhZyA9IFB5U3RyaW5nX0FTX1NUUklORyh0YWdfb2JqZWN0KQorICAgICAgICAgICAgICAgIHNlcXVlbmNlX3N0eWxlID0gWUFNTF9CTE9DS19TRVFVRU5DRV9TVFlMRQorICAgICAgICAgICAgICAgIGlmIG5vZGUuZmxvd19zdHlsZToKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2Vfc3R5bGUgPSBZQU1MX0ZMT1dfU0VRVUVOQ0VfU1RZTEUKKyAgICAgICAgICAgICAgICBpZiB5YW1sX3NlcXVlbmNlX3N0YXJ0X2V2ZW50X2luaXRpYWxpemUoJmV2ZW50LCBhbmNob3IsIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0LCBzZXF1ZW5jZV9zdHlsZSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWVtb3J5RXJyb3IKKyAgICAgICAgICAgICAgICBpZiB5YW1sX2VtaXR0ZXJfZW1pdCgmc2VsZi5lbWl0dGVyLCAmZXZlbnQpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgICAgICAgICAgaXRlbV9pbmRleCA9IDAKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXJpYWxpemVfbm9kZShpdGVtLCBub2RlLCBpdGVtX2luZGV4KQorICAgICAgICAgICAgICAgICAgICBpdGVtX2luZGV4ID0gaXRlbV9pbmRleCsxCisgICAgICAgICAgICAgICAgeWFtbF9zZXF1ZW5jZV9lbmRfZXZlbnRfaW5pdGlhbGl6ZSgmZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2VtaXQoJnNlbGYuZW1pdHRlciwgJmV2ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX2VtaXR0ZXJfZXJyb3IoKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICAgICAgZWxpZiBub2RlX2NsYXNzIGlzIE1hcHBpbmdOb2RlOgorICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gMAorICAgICAgICAgICAgICAgIHRhZ19vYmplY3QgPSBub2RlLnRhZworICAgICAgICAgICAgICAgIGlmIHNlbGYucmVzb2x2ZShNYXBwaW5nTm9kZSwgbm9kZS52YWx1ZSwgVHJ1ZSkgPT0gdGFnX29iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAxCisgICAgICAgICAgICAgICAgdGFnID0gTlVMTAorICAgICAgICAgICAgICAgIGlmIHRhZ19vYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIFB5VW5pY29kZV9DaGVja0V4YWN0KHRhZ19vYmplY3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFnX29iamVjdCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodGFnX29iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IFB5U3RyaW5nX0NoZWNrRXhhY3QodGFnX29iamVjdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRhZyBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKHUidGFnIG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICB0YWcgPSBQeVN0cmluZ19BU19TVFJJTkcodGFnX29iamVjdCkKKyAgICAgICAgICAgICAgICBtYXBwaW5nX3N0eWxlID0gWUFNTF9CTE9DS19NQVBQSU5HX1NUWUxFCisgICAgICAgICAgICAgICAgaWYgbm9kZS5mbG93X3N0eWxlOgorICAgICAgICAgICAgICAgICAgICBtYXBwaW5nX3N0eWxlID0gWUFNTF9GTE9XX01BUFBJTkdfU1RZTEUKKyAgICAgICAgICAgICAgICBpZiB5YW1sX21hcHBpbmdfc3RhcnRfZXZlbnRfaW5pdGlhbGl6ZSgmZXZlbnQsIGFuY2hvciwgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQsIG1hcHBpbmdfc3R5bGUpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1lbW9yeUVycm9yCisgICAgICAgICAgICAgICAgaWYgeWFtbF9lbWl0dGVyX2VtaXQoJnNlbGYuZW1pdHRlciwgJmV2ZW50KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuX2VtaXR0ZXJfZXJyb3IoKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICAgICAgICAgIGZvciBpdGVtX2tleSwgaXRlbV92YWx1ZSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXJpYWxpemVfbm9kZShpdGVtX2tleSwgbm9kZSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2VyaWFsaXplX25vZGUoaXRlbV92YWx1ZSwgbm9kZSwgaXRlbV9rZXkpCisgICAgICAgICAgICAgICAgeWFtbF9tYXBwaW5nX2VuZF9ldmVudF9pbml0aWFsaXplKCZldmVudCkKKyAgICAgICAgICAgICAgICBpZiB5YW1sX2VtaXR0ZXJfZW1pdCgmc2VsZi5lbWl0dGVyLCAmZXZlbnQpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gc2VsZi5fZW1pdHRlcl9lcnJvcigpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgICAgICBzZWxmLmFzY2VuZF9yZXNvbHZlcigpCisgICAgICAgIHJldHVybiAxCisKK2NkZWYgaW50IG91dHB1dF9oYW5kbGVyKHZvaWQgKmRhdGEsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIGV4Y2VwdCAwOgorICAgIGNkZWYgQ0VtaXR0ZXIgZW1pdHRlcgorICAgIGVtaXR0ZXIgPSA8Q0VtaXR0ZXI+ZGF0YQorICAgIGlmIGVtaXR0ZXIuZHVtcF91bmljb2RlID09IDA6CisgICAgICAgIHZhbHVlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBzaXplKQorICAgIGVsc2U6CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0RlY29kZVVURjgoYnVmZmVyLCBzaXplLCAnc3RyaWN0JykKKyAgICBlbWl0dGVyLnN0cmVhbS53cml0ZSh2YWx1ZSkKKyAgICByZXR1cm4gMQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9fX2luaXRfXy5weSBiL2xpYi95YW1sL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTE5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMxNSBAQAorCitmcm9tIGVycm9yIGltcG9ydCAqCisKK2Zyb20gdG9rZW5zIGltcG9ydCAqCitmcm9tIGV2ZW50cyBpbXBvcnQgKgorZnJvbSBub2RlcyBpbXBvcnQgKgorCitmcm9tIGxvYWRlciBpbXBvcnQgKgorZnJvbSBkdW1wZXIgaW1wb3J0ICoKKworX192ZXJzaW9uX18gPSAnMy4xMScKKwordHJ5OgorICAgIGZyb20gY3lhbWwgaW1wb3J0ICoKKyAgICBfX3dpdGhfbGlieWFtbF9fID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9fd2l0aF9saWJ5YW1sX18gPSBGYWxzZQorCitkZWYgc2NhbihzdHJlYW0sIExvYWRlcj1Mb2FkZXIpOgorICAgICIiIgorICAgIFNjYW4gYSBZQU1MIHN0cmVhbSBhbmQgcHJvZHVjZSBzY2FubmluZyB0b2tlbnMuCisgICAgIiIiCisgICAgbG9hZGVyID0gTG9hZGVyKHN0cmVhbSkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIGxvYWRlci5jaGVja190b2tlbigpOgorICAgICAgICAgICAgeWllbGQgbG9hZGVyLmdldF90b2tlbigpCisgICAgZmluYWxseToKKyAgICAgICAgbG9hZGVyLmRpc3Bvc2UoKQorCitkZWYgcGFyc2Uoc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBQYXJzZSBhIFlBTUwgc3RyZWFtIGFuZCBwcm9kdWNlIHBhcnNpbmcgZXZlbnRzLgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfZXZlbnQoKToKKyAgICAgICAgICAgIHlpZWxkIGxvYWRlci5nZXRfZXZlbnQoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvYWRlci5kaXNwb3NlKCkKKworZGVmIGNvbXBvc2Uoc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgZmlyc3QgWUFNTCBkb2N1bWVudCBpbiBhIHN0cmVhbQorICAgIGFuZCBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIHJlcHJlc2VudGF0aW9uIHRyZWUuCisgICAgIiIiCisgICAgbG9hZGVyID0gTG9hZGVyKHN0cmVhbSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0X3NpbmdsZV9ub2RlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2FkZXIuZGlzcG9zZSgpCisKK2RlZiBjb21wb3NlX2FsbChzdHJlYW0sIExvYWRlcj1Mb2FkZXIpOgorICAgICIiIgorICAgIFBhcnNlIGFsbCBZQU1MIGRvY3VtZW50cyBpbiBhIHN0cmVhbQorICAgIGFuZCBwcm9kdWNlIGNvcnJlc3BvbmRpbmcgcmVwcmVzZW50YXRpb24gdHJlZXMuCisgICAgIiIiCisgICAgbG9hZGVyID0gTG9hZGVyKHN0cmVhbSkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIGxvYWRlci5jaGVja19ub2RlKCk6CisgICAgICAgICAgICB5aWVsZCBsb2FkZXIuZ2V0X25vZGUoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvYWRlci5kaXNwb3NlKCkKKworZGVmIGxvYWQoc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgZmlyc3QgWUFNTCBkb2N1bWVudCBpbiBhIHN0cmVhbQorICAgIGFuZCBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3QuCisgICAgIiIiCisgICAgbG9hZGVyID0gTG9hZGVyKHN0cmVhbSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0X3NpbmdsZV9kYXRhKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2FkZXIuZGlzcG9zZSgpCisKK2RlZiBsb2FkX2FsbChzdHJlYW0sIExvYWRlcj1Mb2FkZXIpOgorICAgICIiIgorICAgIFBhcnNlIGFsbCBZQU1MIGRvY3VtZW50cyBpbiBhIHN0cmVhbQorICAgIGFuZCBwcm9kdWNlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIG9iamVjdHMuCisgICAgIiIiCisgICAgbG9hZGVyID0gTG9hZGVyKHN0cmVhbSkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIGxvYWRlci5jaGVja19kYXRhKCk6CisgICAgICAgICAgICB5aWVsZCBsb2FkZXIuZ2V0X2RhdGEoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvYWRlci5kaXNwb3NlKCkKKworZGVmIHNhZmVfbG9hZChzdHJlYW0pOgorICAgICIiIgorICAgIFBhcnNlIHRoZSBmaXJzdCBZQU1MIGRvY3VtZW50IGluIGEgc3RyZWFtCisgICAgYW5kIHByb2R1Y2UgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIG9iamVjdC4KKyAgICBSZXNvbHZlIG9ubHkgYmFzaWMgWUFNTCB0YWdzLgorICAgICIiIgorICAgIHJldHVybiBsb2FkKHN0cmVhbSwgU2FmZUxvYWRlcikKKworZGVmIHNhZmVfbG9hZF9hbGwoc3RyZWFtKToKKyAgICAiIiIKKyAgICBQYXJzZSBhbGwgWUFNTCBkb2N1bWVudHMgaW4gYSBzdHJlYW0KKyAgICBhbmQgcHJvZHVjZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3RzLgorICAgIFJlc29sdmUgb25seSBiYXNpYyBZQU1MIHRhZ3MuCisgICAgIiIiCisgICAgcmV0dXJuIGxvYWRfYWxsKHN0cmVhbSwgU2FmZUxvYWRlcikKKworZGVmIGVtaXQoZXZlbnRzLCBzdHJlYW09Tm9uZSwgRHVtcGVyPUR1bXBlciwKKyAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSk6CisgICAgIiIiCisgICAgRW1pdCBZQU1MIHBhcnNpbmcgZXZlbnRzIGludG8gYSBzdHJlYW0uCisgICAgSWYgc3RyZWFtIGlzIE5vbmUsIHJldHVybiB0aGUgcHJvZHVjZWQgc3RyaW5nIGluc3RlYWQuCisgICAgIiIiCisgICAgZ2V0dmFsdWUgPSBOb25lCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2V0dmFsdWUgPSBzdHJlYW0uZ2V0dmFsdWUKKyAgICBkdW1wZXIgPSBEdW1wZXIoc3RyZWFtLCBjYW5vbmljYWw9Y2Fub25pY2FsLCBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrKQorICAgIHRyeToKKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIGR1bXBlci5lbWl0KGV2ZW50KQorICAgIGZpbmFsbHk6CisgICAgICAgIGR1bXBlci5kaXNwb3NlKCkKKyAgICBpZiBnZXR2YWx1ZToKKyAgICAgICAgcmV0dXJuIGdldHZhbHVlKCkKKworZGVmIHNlcmlhbGl6ZV9hbGwobm9kZXMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9RHVtcGVyLAorICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICBlbmNvZGluZz0ndXRmLTgnLCBleHBsaWNpdF9zdGFydD1Ob25lLCBleHBsaWNpdF9lbmQ9Tm9uZSwKKyAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICIiIgorICAgIFNlcmlhbGl6ZSBhIHNlcXVlbmNlIG9mIHJlcHJlc2VudGF0aW9uIHRyZWVzIGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICBnZXR2YWx1ZSA9IE5vbmUKKyAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oKQorICAgICAgICBnZXR2YWx1ZSA9IHN0cmVhbS5nZXR2YWx1ZQorICAgIGR1bXBlciA9IER1bXBlcihzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsIGluZGVudD1pbmRlbnQsIHdpZHRoPXdpZHRoLAorICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWssCisgICAgICAgICAgICBlbmNvZGluZz1lbmNvZGluZywgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MsCisgICAgICAgICAgICBleHBsaWNpdF9zdGFydD1leHBsaWNpdF9zdGFydCwgZXhwbGljaXRfZW5kPWV4cGxpY2l0X2VuZCkKKyAgICB0cnk6CisgICAgICAgIGR1bXBlci5vcGVuKCkKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgICAgICBkdW1wZXIuc2VyaWFsaXplKG5vZGUpCisgICAgICAgIGR1bXBlci5jbG9zZSgpCisgICAgZmluYWxseToKKyAgICAgICAgZHVtcGVyLmRpc3Bvc2UoKQorICAgIGlmIGdldHZhbHVlOgorICAgICAgICByZXR1cm4gZ2V0dmFsdWUoKQorCitkZWYgc2VyaWFsaXplKG5vZGUsIHN0cmVhbT1Ob25lLCBEdW1wZXI9RHVtcGVyLCAqKmt3ZHMpOgorICAgICIiIgorICAgIFNlcmlhbGl6ZSBhIHJlcHJlc2VudGF0aW9uIHRyZWUgaW50byBhIFlBTUwgc3RyZWFtLgorICAgIElmIHN0cmVhbSBpcyBOb25lLCByZXR1cm4gdGhlIHByb2R1Y2VkIHN0cmluZyBpbnN0ZWFkLgorICAgICIiIgorICAgIHJldHVybiBzZXJpYWxpemVfYWxsKFtub2RlXSwgc3RyZWFtLCBEdW1wZXI9RHVtcGVyLCAqKmt3ZHMpCisKK2RlZiBkdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9RHVtcGVyLAorICAgICAgICBkZWZhdWx0X3N0eWxlPU5vbmUsIGRlZmF1bHRfZmxvd19zdHlsZT1Ob25lLAorICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICBlbmNvZGluZz0ndXRmLTgnLCBleHBsaWNpdF9zdGFydD1Ob25lLCBleHBsaWNpdF9lbmQ9Tm9uZSwKKyAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICIiIgorICAgIFNlcmlhbGl6ZSBhIHNlcXVlbmNlIG9mIFB5dGhvbiBvYmplY3RzIGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICBnZXR2YWx1ZSA9IE5vbmUKKyAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oKQorICAgICAgICBnZXR2YWx1ZSA9IHN0cmVhbS5nZXR2YWx1ZQorICAgIGR1bXBlciA9IER1bXBlcihzdHJlYW0sIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgIGRlZmF1bHRfZmxvd19zdHlsZT1kZWZhdWx0X2Zsb3dfc3R5bGUsCisgICAgICAgICAgICBjYW5vbmljYWw9Y2Fub25pY2FsLCBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgZW5jb2Rpbmc9ZW5jb2RpbmcsIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzLAorICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQpCisgICAgdHJ5OgorICAgICAgICBkdW1wZXIub3BlbigpCisgICAgICAgIGZvciBkYXRhIGluIGRvY3VtZW50czoKKyAgICAgICAgICAgIGR1bXBlci5yZXByZXNlbnQoZGF0YSkKKyAgICAgICAgZHVtcGVyLmNsb3NlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBkdW1wZXIuZGlzcG9zZSgpCisgICAgaWYgZ2V0dmFsdWU6CisgICAgICAgIHJldHVybiBnZXR2YWx1ZSgpCisKK2RlZiBkdW1wKGRhdGEsIHN0cmVhbT1Ob25lLCBEdW1wZXI9RHVtcGVyLCAqKmt3ZHMpOgorICAgICIiIgorICAgIFNlcmlhbGl6ZSBhIFB5dGhvbiBvYmplY3QgaW50byBhIFlBTUwgc3RyZWFtLgorICAgIElmIHN0cmVhbSBpcyBOb25lLCByZXR1cm4gdGhlIHByb2R1Y2VkIHN0cmluZyBpbnN0ZWFkLgorICAgICIiIgorICAgIHJldHVybiBkdW1wX2FsbChbZGF0YV0sIHN0cmVhbSwgRHVtcGVyPUR1bXBlciwgKiprd2RzKQorCitkZWYgc2FmZV9kdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCAqKmt3ZHMpOgorICAgICIiIgorICAgIFNlcmlhbGl6ZSBhIHNlcXVlbmNlIG9mIFB5dGhvbiBvYmplY3RzIGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBQcm9kdWNlIG9ubHkgYmFzaWMgWUFNTCB0YWdzLgorICAgIElmIHN0cmVhbSBpcyBOb25lLCByZXR1cm4gdGhlIHByb2R1Y2VkIHN0cmluZyBpbnN0ZWFkLgorICAgICIiIgorICAgIHJldHVybiBkdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbSwgRHVtcGVyPVNhZmVEdW1wZXIsICoqa3dkcykKKworZGVmIHNhZmVfZHVtcChkYXRhLCBzdHJlYW09Tm9uZSwgKiprd2RzKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSBQeXRob24gb2JqZWN0IGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBQcm9kdWNlIG9ubHkgYmFzaWMgWUFNTCB0YWdzLgorICAgIElmIHN0cmVhbSBpcyBOb25lLCByZXR1cm4gdGhlIHByb2R1Y2VkIHN0cmluZyBpbnN0ZWFkLgorICAgICIiIgorICAgIHJldHVybiBkdW1wX2FsbChbZGF0YV0sIHN0cmVhbSwgRHVtcGVyPVNhZmVEdW1wZXIsICoqa3dkcykKKworZGVmIGFkZF9pbXBsaWNpdF9yZXNvbHZlcih0YWcsIHJlZ2V4cCwgZmlyc3Q9Tm9uZSwKKyAgICAgICAgTG9hZGVyPUxvYWRlciwgRHVtcGVyPUR1bXBlcik6CisgICAgIiIiCisgICAgQWRkIGFuIGltcGxpY2l0IHNjYWxhciBkZXRlY3Rvci4KKyAgICBJZiBhbiBpbXBsaWNpdCBzY2FsYXIgdmFsdWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVnZXhwLAorICAgIHRoZSBjb3JyZXNwb25kaW5nIHRhZyBpcyBhc3NpZ25lZCB0byB0aGUgc2NhbGFyLgorICAgIGZpcnN0IGlzIGEgc2VxdWVuY2Ugb2YgcG9zc2libGUgaW5pdGlhbCBjaGFyYWN0ZXJzIG9yIE5vbmUuCisgICAgIiIiCisgICAgTG9hZGVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcih0YWcsIHJlZ2V4cCwgZmlyc3QpCisgICAgRHVtcGVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcih0YWcsIHJlZ2V4cCwgZmlyc3QpCisKK2RlZiBhZGRfcGF0aF9yZXNvbHZlcih0YWcsIHBhdGgsIGtpbmQ9Tm9uZSwgTG9hZGVyPUxvYWRlciwgRHVtcGVyPUR1bXBlcik6CisgICAgIiIiCisgICAgQWRkIGEgcGF0aCBiYXNlZCByZXNvbHZlciBmb3IgdGhlIGdpdmVuIHRhZy4KKyAgICBBIHBhdGggaXMgYSBsaXN0IG9mIGtleXMgdGhhdCBmb3JtcyBhIHBhdGgKKyAgICB0byBhIG5vZGUgaW4gdGhlIHJlcHJlc2VudGF0aW9uIHRyZWUuCisgICAgS2V5cyBjYW4gYmUgc3RyaW5nIHZhbHVlcywgaW50ZWdlcnMsIG9yIE5vbmUuCisgICAgIiIiCisgICAgTG9hZGVyLmFkZF9wYXRoX3Jlc29sdmVyKHRhZywgcGF0aCwga2luZCkKKyAgICBEdW1wZXIuYWRkX3BhdGhfcmVzb2x2ZXIodGFnLCBwYXRoLCBraW5kKQorCitkZWYgYWRkX2NvbnN0cnVjdG9yKHRhZywgY29uc3RydWN0b3IsIExvYWRlcj1Mb2FkZXIpOgorICAgICIiIgorICAgIEFkZCBhIGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gdGFnLgorICAgIENvbnN0cnVjdG9yIGlzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgTG9hZGVyIGluc3RhbmNlCisgICAgYW5kIGEgbm9kZSBvYmplY3QgYW5kIHByb2R1Y2VzIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3QuCisgICAgIiIiCisgICAgTG9hZGVyLmFkZF9jb25zdHJ1Y3Rvcih0YWcsIGNvbnN0cnVjdG9yKQorCitkZWYgYWRkX211bHRpX2NvbnN0cnVjdG9yKHRhZ19wcmVmaXgsIG11bHRpX2NvbnN0cnVjdG9yLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBBZGQgYSBtdWx0aS1jb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIHRhZyBwcmVmaXguCisgICAgTXVsdGktY29uc3RydWN0b3IgaXMgY2FsbGVkIGZvciBhIG5vZGUgaWYgaXRzIHRhZyBzdGFydHMgd2l0aCB0YWdfcHJlZml4LgorICAgIE11bHRpLWNvbnN0cnVjdG9yIGFjY2VwdHMgYSBMb2FkZXIgaW5zdGFuY2UsIGEgdGFnIHN1ZmZpeCwKKyAgICBhbmQgYSBub2RlIG9iamVjdCBhbmQgcHJvZHVjZXMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIG9iamVjdC4KKyAgICAiIiIKKyAgICBMb2FkZXIuYWRkX211bHRpX2NvbnN0cnVjdG9yKHRhZ19wcmVmaXgsIG11bHRpX2NvbnN0cnVjdG9yKQorCitkZWYgYWRkX3JlcHJlc2VudGVyKGRhdGFfdHlwZSwgcmVwcmVzZW50ZXIsIER1bXBlcj1EdW1wZXIpOgorICAgICIiIgorICAgIEFkZCBhIHJlcHJlc2VudGVyIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICBSZXByZXNlbnRlciBpcyBhIGZ1bmN0aW9uIGFjY2VwdGluZyBhIER1bXBlciBpbnN0YW5jZQorICAgIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZGF0YSB0eXBlCisgICAgYW5kIHByb2R1Y2luZyB0aGUgY29ycmVzcG9uZGluZyByZXByZXNlbnRhdGlvbiBub2RlLgorICAgICIiIgorICAgIER1bXBlci5hZGRfcmVwcmVzZW50ZXIoZGF0YV90eXBlLCByZXByZXNlbnRlcikKKworZGVmIGFkZF9tdWx0aV9yZXByZXNlbnRlcihkYXRhX3R5cGUsIG11bHRpX3JlcHJlc2VudGVyLCBEdW1wZXI9RHVtcGVyKToKKyAgICAiIiIKKyAgICBBZGQgYSByZXByZXNlbnRlciBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgTXVsdGktcmVwcmVzZW50ZXIgaXMgYSBmdW5jdGlvbiBhY2NlcHRpbmcgYSBEdW1wZXIgaW5zdGFuY2UKKyAgICBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGRhdGEgdHlwZSBvciBzdWJ0eXBlCisgICAgYW5kIHByb2R1Y2luZyB0aGUgY29ycmVzcG9uZGluZyByZXByZXNlbnRhdGlvbiBub2RlLgorICAgICIiIgorICAgIER1bXBlci5hZGRfbXVsdGlfcmVwcmVzZW50ZXIoZGF0YV90eXBlLCBtdWx0aV9yZXByZXNlbnRlcikKKworY2xhc3MgWUFNTE9iamVjdE1ldGFjbGFzcyh0eXBlKToKKyAgICAiIiIKKyAgICBUaGUgbWV0YWNsYXNzIGZvciBZQU1MT2JqZWN0LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBrd2RzKToKKyAgICAgICAgc3VwZXIoWUFNTE9iamVjdE1ldGFjbGFzcywgY2xzKS5fX2luaXRfXyhuYW1lLCBiYXNlcywga3dkcykKKyAgICAgICAgaWYgJ3lhbWxfdGFnJyBpbiBrd2RzIGFuZCBrd2RzWyd5YW1sX3RhZyddIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2xzLnlhbWxfbG9hZGVyLmFkZF9jb25zdHJ1Y3RvcihjbHMueWFtbF90YWcsIGNscy5mcm9tX3lhbWwpCisgICAgICAgICAgICBjbHMueWFtbF9kdW1wZXIuYWRkX3JlcHJlc2VudGVyKGNscywgY2xzLnRvX3lhbWwpCisKK2NsYXNzIFlBTUxPYmplY3Qob2JqZWN0KToKKyAgICAiIiIKKyAgICBBbiBvYmplY3QgdGhhdCBjYW4gZHVtcCBpdHNlbGYgdG8gYSBZQU1MIHN0cmVhbQorICAgIGFuZCBsb2FkIGl0c2VsZiBmcm9tIGEgWUFNTCBzdHJlYW0uCisgICAgIiIiCisKKyAgICBfX21ldGFjbGFzc19fID0gWUFNTE9iamVjdE1ldGFjbGFzcworICAgIF9fc2xvdHNfXyA9ICgpICAjIG5vIGRpcmVjdCBpbnN0YW50aWF0aW9uLCBzbyBhbGxvdyBpbW11dGFibGUgc3ViY2xhc3NlcworCisgICAgeWFtbF9sb2FkZXIgPSBMb2FkZXIKKyAgICB5YW1sX2R1bXBlciA9IER1bXBlcgorCisgICAgeWFtbF90YWcgPSBOb25lCisgICAgeWFtbF9mbG93X3N0eWxlID0gTm9uZQorCisgICAgZGVmIGZyb21feWFtbChjbHMsIGxvYWRlciwgbm9kZSk6CisgICAgICAgICIiIgorICAgICAgICBDb252ZXJ0IGEgcmVwcmVzZW50YXRpb24gbm9kZSB0byBhIFB5dGhvbiBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbG9hZGVyLmNvbnN0cnVjdF95YW1sX29iamVjdChub2RlLCBjbHMpCisgICAgZnJvbV95YW1sID0gY2xhc3NtZXRob2QoZnJvbV95YW1sKQorCisgICAgZGVmIHRvX3lhbWwoY2xzLCBkdW1wZXIsIGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCBhIFB5dGhvbiBvYmplY3QgdG8gYSByZXByZXNlbnRhdGlvbiBub2RlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGR1bXBlci5yZXByZXNlbnRfeWFtbF9vYmplY3QoY2xzLnlhbWxfdGFnLCBkYXRhLCBjbHMsCisgICAgICAgICAgICAgICAgZmxvd19zdHlsZT1jbHMueWFtbF9mbG93X3N0eWxlKQorICAgIHRvX3lhbWwgPSBjbGFzc21ldGhvZCh0b195YW1sKQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9jb21wb3Nlci5weSBiL2xpYi95YW1sL2NvbXBvc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTVhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9jb21wb3Nlci5weQpAQCAtMCwwICsxLDEzOSBAQAorCitfX2FsbF9fID0gWydDb21wb3NlcicsICdDb21wb3NlckVycm9yJ10KKworZnJvbSBlcnJvciBpbXBvcnQgTWFya2VkWUFNTEVycm9yCitmcm9tIGV2ZW50cyBpbXBvcnQgKgorZnJvbSBub2RlcyBpbXBvcnQgKgorCitjbGFzcyBDb21wb3NlckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBDb21wb3NlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorCisgICAgZGVmIGNoZWNrX25vZGUoc2VsZik6CisgICAgICAgICMgRHJvcCB0aGUgU1RSRUFNLVNUQVJUIGV2ZW50LgorICAgICAgICBpZiBzZWxmLmNoZWNrX2V2ZW50KFN0cmVhbVN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgc2VsZi5nZXRfZXZlbnQoKQorCisgICAgICAgICMgSWYgdGhlcmUgYXJlIG1vcmUgZG9jdW1lbnRzIGF2YWlsYWJsZT8KKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmNoZWNrX2V2ZW50KFN0cmVhbUVuZEV2ZW50KQorCisgICAgZGVmIGdldF9ub2RlKHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgcm9vdCBub2RlIG9mIHRoZSBuZXh0IGRvY3VtZW50LgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19ldmVudChTdHJlYW1FbmRFdmVudCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wb3NlX2RvY3VtZW50KCkKKworICAgIGRlZiBnZXRfc2luZ2xlX25vZGUoc2VsZik6CisgICAgICAgICMgRHJvcCB0aGUgU1RSRUFNLVNUQVJUIGV2ZW50LgorICAgICAgICBzZWxmLmdldF9ldmVudCgpCisKKyAgICAgICAgIyBDb21wb3NlIGEgZG9jdW1lbnQgaWYgdGhlIHN0cmVhbSBpcyBub3QgZW1wdHkuCisgICAgICAgIGRvY3VtZW50ID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19ldmVudChTdHJlYW1FbmRFdmVudCk6CisgICAgICAgICAgICBkb2N1bWVudCA9IHNlbGYuY29tcG9zZV9kb2N1bWVudCgpCisKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgc3RyZWFtIGNvbnRhaW5zIG5vIG1vcmUgZG9jdW1lbnRzLgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19ldmVudChTdHJlYW1FbmRFdmVudCk6CisgICAgICAgICAgICBldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgICAgIHJhaXNlIENvbXBvc2VyRXJyb3IoImV4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydF9tYXJrLCAiYnV0IGZvdW5kIGFub3RoZXIgZG9jdW1lbnQiLAorICAgICAgICAgICAgICAgICAgICBldmVudC5zdGFydF9tYXJrKQorCisgICAgICAgICMgRHJvcCB0aGUgU1RSRUFNLUVORCBldmVudC4KKyAgICAgICAgc2VsZi5nZXRfZXZlbnQoKQorCisgICAgICAgIHJldHVybiBkb2N1bWVudAorCisgICAgZGVmIGNvbXBvc2VfZG9jdW1lbnQoc2VsZik6CisgICAgICAgICMgRHJvcCB0aGUgRE9DVU1FTlQtU1RBUlQgZXZlbnQuCisgICAgICAgIHNlbGYuZ2V0X2V2ZW50KCkKKworICAgICAgICAjIENvbXBvc2UgdGhlIHJvb3Qgbm9kZS4KKyAgICAgICAgbm9kZSA9IHNlbGYuY29tcG9zZV9ub2RlKE5vbmUsIE5vbmUpCisKKyAgICAgICAgIyBEcm9wIHRoZSBET0NVTUVOVC1FTkQgZXZlbnQuCisgICAgICAgIHNlbGYuZ2V0X2V2ZW50KCkKKworICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGNvbXBvc2Vfbm9kZShzZWxmLCBwYXJlbnQsIGluZGV4KToKKyAgICAgICAgaWYgc2VsZi5jaGVja19ldmVudChBbGlhc0V2ZW50KToKKyAgICAgICAgICAgIGV2ZW50ID0gc2VsZi5nZXRfZXZlbnQoKQorICAgICAgICAgICAgYW5jaG9yID0gZXZlbnQuYW5jaG9yCisgICAgICAgICAgICBpZiBhbmNob3Igbm90IGluIHNlbGYuYW5jaG9yczoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wb3NlckVycm9yKE5vbmUsIE5vbmUsICJmb3VuZCB1bmRlZmluZWQgYWxpYXMgJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIGFuY2hvci5lbmNvZGUoJ3V0Zi04JyksIGV2ZW50LnN0YXJ0X21hcmspCisgICAgICAgICAgICByZXR1cm4gc2VsZi5hbmNob3JzW2FuY2hvcl0KKyAgICAgICAgZXZlbnQgPSBzZWxmLnBlZWtfZXZlbnQoKQorICAgICAgICBhbmNob3IgPSBldmVudC5hbmNob3IKKyAgICAgICAgaWYgYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgYW5jaG9yIGluIHNlbGYuYW5jaG9yczoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wb3NlckVycm9yKCJmb3VuZCBkdXBsaWNhdGUgYW5jaG9yICVyOyBmaXJzdCBvY2N1cmVuY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAlIGFuY2hvci5lbmNvZGUoJ3V0Zi04JyksIHNlbGYuYW5jaG9yc1thbmNob3JdLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIG9jY3VyZW5jZSIsIGV2ZW50LnN0YXJ0X21hcmspCisgICAgICAgIHNlbGYuZGVzY2VuZF9yZXNvbHZlcihwYXJlbnQsIGluZGV4KQorICAgICAgICBpZiBzZWxmLmNoZWNrX2V2ZW50KFNjYWxhckV2ZW50KToKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbXBvc2Vfc2NhbGFyX25vZGUoYW5jaG9yKQorICAgICAgICBlbGlmIHNlbGYuY2hlY2tfZXZlbnQoU2VxdWVuY2VTdGFydEV2ZW50KToKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbXBvc2Vfc2VxdWVuY2Vfbm9kZShhbmNob3IpCisgICAgICAgIGVsaWYgc2VsZi5jaGVja19ldmVudChNYXBwaW5nU3RhcnRFdmVudCk6CisgICAgICAgICAgICBub2RlID0gc2VsZi5jb21wb3NlX21hcHBpbmdfbm9kZShhbmNob3IpCisgICAgICAgIHNlbGYuYXNjZW5kX3Jlc29sdmVyKCkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBjb21wb3NlX3NjYWxhcl9ub2RlKHNlbGYsIGFuY2hvcik6CisgICAgICAgIGV2ZW50ID0gc2VsZi5nZXRfZXZlbnQoKQorICAgICAgICB0YWcgPSBldmVudC50YWcKKyAgICAgICAgaWYgdGFnIGlzIE5vbmUgb3IgdGFnID09IHUnISc6CisgICAgICAgICAgICB0YWcgPSBzZWxmLnJlc29sdmUoU2NhbGFyTm9kZSwgZXZlbnQudmFsdWUsIGV2ZW50LmltcGxpY2l0KQorICAgICAgICBub2RlID0gU2NhbGFyTm9kZSh0YWcsIGV2ZW50LnZhbHVlLAorICAgICAgICAgICAgICAgIGV2ZW50LnN0YXJ0X21hcmssIGV2ZW50LmVuZF9tYXJrLCBzdHlsZT1ldmVudC5zdHlsZSkKKyAgICAgICAgaWYgYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbmNob3JzW2FuY2hvcl0gPSBub2RlCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgY29tcG9zZV9zZXF1ZW5jZV9ub2RlKHNlbGYsIGFuY2hvcik6CisgICAgICAgIHN0YXJ0X2V2ZW50ID0gc2VsZi5nZXRfZXZlbnQoKQorICAgICAgICB0YWcgPSBzdGFydF9ldmVudC50YWcKKyAgICAgICAgaWYgdGFnIGlzIE5vbmUgb3IgdGFnID09IHUnISc6CisgICAgICAgICAgICB0YWcgPSBzZWxmLnJlc29sdmUoU2VxdWVuY2VOb2RlLCBOb25lLCBzdGFydF9ldmVudC5pbXBsaWNpdCkKKyAgICAgICAgbm9kZSA9IFNlcXVlbmNlTm9kZSh0YWcsIFtdLAorICAgICAgICAgICAgICAgIHN0YXJ0X2V2ZW50LnN0YXJ0X21hcmssIE5vbmUsCisgICAgICAgICAgICAgICAgZmxvd19zdHlsZT1zdGFydF9ldmVudC5mbG93X3N0eWxlKQorICAgICAgICBpZiBhbmNob3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFuY2hvcnNbYW5jaG9yXSA9IG5vZGUKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNoZWNrX2V2ZW50KFNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgbm9kZS52YWx1ZS5hcHBlbmQoc2VsZi5jb21wb3NlX25vZGUobm9kZSwgaW5kZXgpKQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICBlbmRfZXZlbnQgPSBzZWxmLmdldF9ldmVudCgpCisgICAgICAgIG5vZGUuZW5kX21hcmsgPSBlbmRfZXZlbnQuZW5kX21hcmsKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBjb21wb3NlX21hcHBpbmdfbm9kZShzZWxmLCBhbmNob3IpOgorICAgICAgICBzdGFydF9ldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgdGFnID0gc3RhcnRfZXZlbnQudGFnCisgICAgICAgIGlmIHRhZyBpcyBOb25lIG9yIHRhZyA9PSB1JyEnOgorICAgICAgICAgICAgdGFnID0gc2VsZi5yZXNvbHZlKE1hcHBpbmdOb2RlLCBOb25lLCBzdGFydF9ldmVudC5pbXBsaWNpdCkKKyAgICAgICAgbm9kZSA9IE1hcHBpbmdOb2RlKHRhZywgW10sCisgICAgICAgICAgICAgICAgc3RhcnRfZXZlbnQuc3RhcnRfbWFyaywgTm9uZSwKKyAgICAgICAgICAgICAgICBmbG93X3N0eWxlPXN0YXJ0X2V2ZW50LmZsb3dfc3R5bGUpCisgICAgICAgIGlmIGFuY2hvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yc1thbmNob3JdID0gbm9kZQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5jaGVja19ldmVudChNYXBwaW5nRW5kRXZlbnQpOgorICAgICAgICAgICAgI2tleV9ldmVudCA9IHNlbGYucGVla19ldmVudCgpCisgICAgICAgICAgICBpdGVtX2tleSA9IHNlbGYuY29tcG9zZV9ub2RlKG5vZGUsIE5vbmUpCisgICAgICAgICAgICAjaWYgaXRlbV9rZXkgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICMgICAgcmFpc2UgQ29tcG9zZXJFcnJvcigid2hpbGUgY29tcG9zaW5nIGEgbWFwcGluZyIsIHN0YXJ0X2V2ZW50LnN0YXJ0X21hcmssCisgICAgICAgICAgICAjICAgICAgICAgICAgImZvdW5kIGR1cGxpY2F0ZSBrZXkiLCBrZXlfZXZlbnQuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGl0ZW1fdmFsdWUgPSBzZWxmLmNvbXBvc2Vfbm9kZShub2RlLCBpdGVtX2tleSkKKyAgICAgICAgICAgICNub2RlLnZhbHVlW2l0ZW1fa2V5XSA9IGl0ZW1fdmFsdWUKKyAgICAgICAgICAgIG5vZGUudmFsdWUuYXBwZW5kKChpdGVtX2tleSwgaXRlbV92YWx1ZSkpCisgICAgICAgIGVuZF9ldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgbm9kZS5lbmRfbWFyayA9IGVuZF9ldmVudC5lbmRfbWFyaworICAgICAgICByZXR1cm4gbm9kZQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9jb25zdHJ1Y3Rvci5weSBiL2xpYi95YW1sL2NvbnN0cnVjdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNWZhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9jb25zdHJ1Y3Rvci5weQpAQCAtMCwwICsxLDY3NSBAQAorCitfX2FsbF9fID0gWydCYXNlQ29uc3RydWN0b3InLCAnU2FmZUNvbnN0cnVjdG9yJywgJ0NvbnN0cnVjdG9yJywKKyAgICAnQ29uc3RydWN0b3JFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0ICoKK2Zyb20gbm9kZXMgaW1wb3J0ICoKKworaW1wb3J0IGRhdGV0aW1lCisKK2ltcG9ydCBiaW5hc2NpaSwgcmUsIHN5cywgdHlwZXMKKworY2xhc3MgQ29uc3RydWN0b3JFcnJvcihNYXJrZWRZQU1MRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgQmFzZUNvbnN0cnVjdG9yKG9iamVjdCk6CisKKyAgICB5YW1sX2NvbnN0cnVjdG9ycyA9IHt9CisgICAgeWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnMgPSB7fQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNvbnN0cnVjdGVkX29iamVjdHMgPSB7fQorICAgICAgICBzZWxmLnJlY3Vyc2l2ZV9vYmplY3RzID0ge30KKyAgICAgICAgc2VsZi5zdGF0ZV9nZW5lcmF0b3JzID0gW10KKyAgICAgICAgc2VsZi5kZWVwX2NvbnN0cnVjdCA9IEZhbHNlCisKKyAgICBkZWYgY2hlY2tfZGF0YShzZWxmKToKKyAgICAgICAgIyBJZiB0aGVyZSBhcmUgbW9yZSBkb2N1bWVudHMgYXZhaWxhYmxlPworICAgICAgICByZXR1cm4gc2VsZi5jaGVja19ub2RlKCkKKworICAgIGRlZiBnZXRfZGF0YShzZWxmKToKKyAgICAgICAgIyBDb25zdHJ1Y3QgYW5kIHJldHVybiB0aGUgbmV4dCBkb2N1bWVudC4KKyAgICAgICAgaWYgc2VsZi5jaGVja19ub2RlKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3RfZG9jdW1lbnQoc2VsZi5nZXRfbm9kZSgpKQorCisgICAgZGVmIGdldF9zaW5nbGVfZGF0YShzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgc3RyZWFtIGNvbnRhaW5zIGEgc2luZ2xlIGRvY3VtZW50IGFuZCBjb25zdHJ1Y3QgaXQuCisgICAgICAgIG5vZGUgPSBzZWxmLmdldF9zaW5nbGVfbm9kZSgpCisgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3RfZG9jdW1lbnQobm9kZSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBjb25zdHJ1Y3RfZG9jdW1lbnQoc2VsZiwgbm9kZSk6CisgICAgICAgIGRhdGEgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3Qobm9kZSkKKyAgICAgICAgd2hpbGUgc2VsZi5zdGF0ZV9nZW5lcmF0b3JzOgorICAgICAgICAgICAgc3RhdGVfZ2VuZXJhdG9ycyA9IHNlbGYuc3RhdGVfZ2VuZXJhdG9ycworICAgICAgICAgICAgc2VsZi5zdGF0ZV9nZW5lcmF0b3JzID0gW10KKyAgICAgICAgICAgIGZvciBnZW5lcmF0b3IgaW4gc3RhdGVfZ2VuZXJhdG9yczoKKyAgICAgICAgICAgICAgICBmb3IgZHVtbXkgaW4gZ2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuY29uc3RydWN0ZWRfb2JqZWN0cyA9IHt9CisgICAgICAgIHNlbGYucmVjdXJzaXZlX29iamVjdHMgPSB7fQorICAgICAgICBzZWxmLmRlZXBfY29uc3RydWN0ID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBjb25zdHJ1Y3Rfb2JqZWN0KHNlbGYsIG5vZGUsIGRlZXA9RmFsc2UpOgorICAgICAgICBpZiBub2RlIGluIHNlbGYuY29uc3RydWN0ZWRfb2JqZWN0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdGVkX29iamVjdHNbbm9kZV0KKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIG9sZF9kZWVwID0gc2VsZi5kZWVwX2NvbnN0cnVjdAorICAgICAgICAgICAgc2VsZi5kZWVwX2NvbnN0cnVjdCA9IFRydWUKKyAgICAgICAgaWYgbm9kZSBpbiBzZWxmLnJlY3Vyc2l2ZV9vYmplY3RzOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5jb25zdHJ1Y3RhYmxlIHJlY3Vyc2l2ZSBub2RlIiwgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICBzZWxmLnJlY3Vyc2l2ZV9vYmplY3RzW25vZGVdID0gTm9uZQorICAgICAgICBjb25zdHJ1Y3RvciA9IE5vbmUKKyAgICAgICAgdGFnX3N1ZmZpeCA9IE5vbmUKKyAgICAgICAgaWYgbm9kZS50YWcgaW4gc2VsZi55YW1sX2NvbnN0cnVjdG9yczoKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2VsZi55YW1sX2NvbnN0cnVjdG9yc1tub2RlLnRhZ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciB0YWdfcHJlZml4IGluIHNlbGYueWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnM6CisgICAgICAgICAgICAgICAgaWYgbm9kZS50YWcuc3RhcnRzd2l0aCh0YWdfcHJlZml4KToKKyAgICAgICAgICAgICAgICAgICAgdGFnX3N1ZmZpeCA9IG5vZGUudGFnW2xlbih0YWdfcHJlZml4KTpdCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2VsZi55YW1sX211bHRpX2NvbnN0cnVjdG9yc1t0YWdfcHJlZml4XQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBOb25lIGluIHNlbGYueWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnM6CisgICAgICAgICAgICAgICAgICAgIHRhZ19zdWZmaXggPSBub2RlLnRhZworICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHNlbGYueWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnNbTm9uZV0KKyAgICAgICAgICAgICAgICBlbGlmIE5vbmUgaW4gc2VsZi55YW1sX2NvbnN0cnVjdG9yczoKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBzZWxmLnlhbWxfY29uc3RydWN0b3JzW05vbmVdCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFNjYWxhck5vZGUpOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHNlbGYuX19jbGFzc19fLmNvbnN0cnVjdF9zY2FsYXIKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBzZWxmLl9fY2xhc3NfXy5jb25zdHJ1Y3Rfc2VxdWVuY2UKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHNlbGYuX19jbGFzc19fLmNvbnN0cnVjdF9tYXBwaW5nCisgICAgICAgIGlmIHRhZ19zdWZmaXggaXMgTm9uZToKKyAgICAgICAgICAgIGRhdGEgPSBjb25zdHJ1Y3RvcihzZWxmLCBub2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IGNvbnN0cnVjdG9yKHNlbGYsIHRhZ19zdWZmaXgsIG5vZGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgdHlwZXMuR2VuZXJhdG9yVHlwZSk6CisgICAgICAgICAgICBnZW5lcmF0b3IgPSBkYXRhCisgICAgICAgICAgICBkYXRhID0gZ2VuZXJhdG9yLm5leHQoKQorICAgICAgICAgICAgaWYgc2VsZi5kZWVwX2NvbnN0cnVjdDoKKyAgICAgICAgICAgICAgICBmb3IgZHVtbXkgaW4gZ2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVfZ2VuZXJhdG9ycy5hcHBlbmQoZ2VuZXJhdG9yKQorICAgICAgICBzZWxmLmNvbnN0cnVjdGVkX29iamVjdHNbbm9kZV0gPSBkYXRhCisgICAgICAgIGRlbCBzZWxmLnJlY3Vyc2l2ZV9vYmplY3RzW25vZGVdCisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBzZWxmLmRlZXBfY29uc3RydWN0ID0gb2xkX2RlZXAKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBjb25zdHJ1Y3Rfc2NhbGFyKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBTY2FsYXJOb2RlKToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2NhbGFyIG5vZGUsIGJ1dCBmb3VuZCAlcyIgJSBub2RlLmlkLAorICAgICAgICAgICAgICAgICAgICBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBub2RlLnZhbHVlCisKKyAgICBkZWYgY29uc3RydWN0X3NlcXVlbmNlKHNlbGYsIG5vZGUsIGRlZXA9RmFsc2UpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBTZXF1ZW5jZU5vZGUpOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzZXF1ZW5jZSBub2RlLCBidXQgZm91bmQgJXMiICUgbm9kZS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICByZXR1cm4gW3NlbGYuY29uc3RydWN0X29iamVjdChjaGlsZCwgZGVlcD1kZWVwKQorICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLnZhbHVlXQorCisgICAgZGVmIGNvbnN0cnVjdF9tYXBwaW5nKHNlbGYsIG5vZGUsIGRlZXA9RmFsc2UpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIG1hcHBpbmcgbm9kZSwgYnV0IGZvdW5kICVzIiAlIG5vZGUuaWQsCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgbWFwcGluZyA9IHt9CisgICAgICAgIGZvciBrZXlfbm9kZSwgdmFsdWVfbm9kZSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAga2V5ID0gc2VsZi5jb25zdHJ1Y3Rfb2JqZWN0KGtleV9ub2RlLCBkZWVwPWRlZXApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFzaChrZXkpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBleGM6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgbWFwcGluZyIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmFjY2VwdGFibGUga2V5ICglcykiICUgZXhjLCBrZXlfbm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3QodmFsdWVfbm9kZSwgZGVlcD1kZWVwKQorICAgICAgICAgICAgbWFwcGluZ1trZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIG1hcHBpbmcKKworICAgIGRlZiBjb25zdHJ1Y3RfcGFpcnMoc2VsZiwgbm9kZSwgZGVlcD1GYWxzZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIE1hcHBpbmdOb2RlKToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgbWFwcGluZyBub2RlLCBidXQgZm91bmQgJXMiICUgbm9kZS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIGZvciBrZXlfbm9kZSwgdmFsdWVfbm9kZSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAga2V5ID0gc2VsZi5jb25zdHJ1Y3Rfb2JqZWN0KGtleV9ub2RlLCBkZWVwPWRlZXApCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X29iamVjdCh2YWx1ZV9ub2RlLCBkZWVwPWRlZXApCisgICAgICAgICAgICBwYWlycy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gcGFpcnMKKworICAgIGRlZiBhZGRfY29uc3RydWN0b3IoY2xzLCB0YWcsIGNvbnN0cnVjdG9yKToKKyAgICAgICAgaWYgbm90ICd5YW1sX2NvbnN0cnVjdG9ycycgaW4gY2xzLl9fZGljdF9fOgorICAgICAgICAgICAgY2xzLnlhbWxfY29uc3RydWN0b3JzID0gY2xzLnlhbWxfY29uc3RydWN0b3JzLmNvcHkoKQorICAgICAgICBjbHMueWFtbF9jb25zdHJ1Y3RvcnNbdGFnXSA9IGNvbnN0cnVjdG9yCisgICAgYWRkX2NvbnN0cnVjdG9yID0gY2xhc3NtZXRob2QoYWRkX2NvbnN0cnVjdG9yKQorCisgICAgZGVmIGFkZF9tdWx0aV9jb25zdHJ1Y3RvcihjbHMsIHRhZ19wcmVmaXgsIG11bHRpX2NvbnN0cnVjdG9yKToKKyAgICAgICAgaWYgbm90ICd5YW1sX211bHRpX2NvbnN0cnVjdG9ycycgaW4gY2xzLl9fZGljdF9fOgorICAgICAgICAgICAgY2xzLnlhbWxfbXVsdGlfY29uc3RydWN0b3JzID0gY2xzLnlhbWxfbXVsdGlfY29uc3RydWN0b3JzLmNvcHkoKQorICAgICAgICBjbHMueWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnNbdGFnX3ByZWZpeF0gPSBtdWx0aV9jb25zdHJ1Y3RvcgorICAgIGFkZF9tdWx0aV9jb25zdHJ1Y3RvciA9IGNsYXNzbWV0aG9kKGFkZF9tdWx0aV9jb25zdHJ1Y3RvcikKKworY2xhc3MgU2FmZUNvbnN0cnVjdG9yKEJhc2VDb25zdHJ1Y3Rvcik6CisKKyAgICBkZWYgY29uc3RydWN0X3NjYWxhcihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICBmb3Iga2V5X25vZGUsIHZhbHVlX25vZGUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICBpZiBrZXlfbm9kZS50YWcgPT0gdSd0YWc6eWFtbC5vcmcsMjAwMjp2YWx1ZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9zY2FsYXIodmFsdWVfbm9kZSkKKyAgICAgICAgcmV0dXJuIEJhc2VDb25zdHJ1Y3Rvci5jb25zdHJ1Y3Rfc2NhbGFyKHNlbGYsIG5vZGUpCisKKyAgICBkZWYgZmxhdHRlbl9tYXBwaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICBtZXJnZSA9IFtdCisgICAgICAgIGluZGV4ID0gMAorICAgICAgICB3aGlsZSBpbmRleCA8IGxlbihub2RlLnZhbHVlKToKKyAgICAgICAgICAgIGtleV9ub2RlLCB2YWx1ZV9ub2RlID0gbm9kZS52YWx1ZVtpbmRleF0KKyAgICAgICAgICAgIGlmIGtleV9ub2RlLnRhZyA9PSB1J3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJzoKKyAgICAgICAgICAgICAgICBkZWwgbm9kZS52YWx1ZVtpbmRleF0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlX25vZGUsIE1hcHBpbmdOb2RlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mbGF0dGVuX21hcHBpbmcodmFsdWVfbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2UuZXh0ZW5kKHZhbHVlX25vZGUudmFsdWUpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlX25vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICAgICAgICAgIHN1Ym1lcmdlID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHN1Ym5vZGUgaW4gdmFsdWVfbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHN1Ym5vZGUsIE1hcHBpbmdOb2RlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBtYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIG1hcHBpbmcgZm9yIG1lcmdpbmcsIGJ1dCBmb3VuZCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3Vibm9kZS5pZCwgc3Vibm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mbGF0dGVuX21hcHBpbmcoc3Vibm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1lcmdlLmFwcGVuZChzdWJub2RlLnZhbHVlKQorICAgICAgICAgICAgICAgICAgICBzdWJtZXJnZS5yZXZlcnNlKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHZhbHVlIGluIHN1Ym1lcmdlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UuZXh0ZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhIG1hcHBpbmciLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgbWFwcGluZyBvciBsaXN0IG9mIG1hcHBpbmdzIGZvciBtZXJnaW5nLCBidXQgZm91bmQgJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2YWx1ZV9ub2RlLmlkLCB2YWx1ZV9ub2RlLnN0YXJ0X21hcmspCisgICAgICAgICAgICBlbGlmIGtleV9ub2RlLnRhZyA9PSB1J3RhZzp5YW1sLm9yZywyMDAyOnZhbHVlJzoKKyAgICAgICAgICAgICAgICBrZXlfbm9kZS50YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnN0cicKKyAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgaWYgbWVyZ2U6CisgICAgICAgICAgICBub2RlLnZhbHVlID0gbWVyZ2UgKyBub2RlLnZhbHVlCisKKyAgICBkZWYgY29uc3RydWN0X21hcHBpbmcoc2VsZiwgbm9kZSwgZGVlcD1GYWxzZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgc2VsZi5mbGF0dGVuX21hcHBpbmcobm9kZSkKKyAgICAgICAgcmV0dXJuIEJhc2VDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfbWFwcGluZyhzZWxmLCBub2RlLCBkZWVwPWRlZXApCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfbnVsbChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBib29sX3ZhbHVlcyA9IHsKKyAgICAgICAgdSd5ZXMnOiAgICAgVHJ1ZSwKKyAgICAgICAgdSdubyc6ICAgICAgRmFsc2UsCisgICAgICAgIHUndHJ1ZSc6ICAgIFRydWUsCisgICAgICAgIHUnZmFsc2UnOiAgIEZhbHNlLAorICAgICAgICB1J29uJzogICAgICBUcnVlLAorICAgICAgICB1J29mZic6ICAgICBGYWxzZSwKKyAgICB9CisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfYm9vbChzZWxmLCBub2RlKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuYm9vbF92YWx1ZXNbdmFsdWUubG93ZXIoKV0KKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9pbnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHZhbHVlID0gc3RyKHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKSkKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdfJywgJycpCisgICAgICAgIHNpZ24gPSArMQorICAgICAgICBpZiB2YWx1ZVswXSA9PSAnLSc6CisgICAgICAgICAgICBzaWduID0gLTEKKyAgICAgICAgaWYgdmFsdWVbMF0gaW4gJystJzoKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMTpdCisgICAgICAgIGlmIHZhbHVlID09ICcwJzoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgdmFsdWUuc3RhcnRzd2l0aCgnMGInKToKKyAgICAgICAgICAgIHJldHVybiBzaWduKmludCh2YWx1ZVsyOl0sIDIpCisgICAgICAgIGVsaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToKKyAgICAgICAgICAgIHJldHVybiBzaWduKmludCh2YWx1ZVsyOl0sIDE2KQorICAgICAgICBlbGlmIHZhbHVlWzBdID09ICcwJzoKKyAgICAgICAgICAgIHJldHVybiBzaWduKmludCh2YWx1ZSwgOCkKKyAgICAgICAgZWxpZiAnOicgaW4gdmFsdWU6CisgICAgICAgICAgICBkaWdpdHMgPSBbaW50KHBhcnQpIGZvciBwYXJ0IGluIHZhbHVlLnNwbGl0KCc6JyldCisgICAgICAgICAgICBkaWdpdHMucmV2ZXJzZSgpCisgICAgICAgICAgICBiYXNlID0gMQorICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBmb3IgZGlnaXQgaW4gZGlnaXRzOgorICAgICAgICAgICAgICAgIHZhbHVlICs9IGRpZ2l0KmJhc2UKKyAgICAgICAgICAgICAgICBiYXNlICo9IDYwCisgICAgICAgICAgICByZXR1cm4gc2lnbip2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNpZ24qaW50KHZhbHVlKQorCisgICAgaW5mX3ZhbHVlID0gMWUzMDAKKyAgICB3aGlsZSBpbmZfdmFsdWUgIT0gaW5mX3ZhbHVlKmluZl92YWx1ZToKKyAgICAgICAgaW5mX3ZhbHVlICo9IGluZl92YWx1ZQorICAgIG5hbl92YWx1ZSA9IC1pbmZfdmFsdWUvaW5mX3ZhbHVlICAgIyBUcnlpbmcgdG8gbWFrZSBhIHF1aWV0IE5hTiAobGlrZSBDOTkpLgorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX2Zsb2F0KHNlbGYsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHN0cihzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkpCisgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXycsICcnKS5sb3dlcigpCisgICAgICAgIHNpZ24gPSArMQorICAgICAgICBpZiB2YWx1ZVswXSA9PSAnLSc6CisgICAgICAgICAgICBzaWduID0gLTEKKyAgICAgICAgaWYgdmFsdWVbMF0gaW4gJystJzoKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMTpdCisgICAgICAgIGlmIHZhbHVlID09ICcuaW5mJzoKKyAgICAgICAgICAgIHJldHVybiBzaWduKnNlbGYuaW5mX3ZhbHVlCisgICAgICAgIGVsaWYgdmFsdWUgPT0gJy5uYW4nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFuX3ZhbHVlCisgICAgICAgIGVsaWYgJzonIGluIHZhbHVlOgorICAgICAgICAgICAgZGlnaXRzID0gW2Zsb2F0KHBhcnQpIGZvciBwYXJ0IGluIHZhbHVlLnNwbGl0KCc6JyldCisgICAgICAgICAgICBkaWdpdHMucmV2ZXJzZSgpCisgICAgICAgICAgICBiYXNlID0gMQorICAgICAgICAgICAgdmFsdWUgPSAwLjAKKyAgICAgICAgICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gZGlnaXQqYmFzZQorICAgICAgICAgICAgICAgIGJhc2UgKj0gNjAKKyAgICAgICAgICAgIHJldHVybiBzaWduKnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2lnbipmbG9hdCh2YWx1ZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9iaW5hcnkoc2VsZiwgbm9kZSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpLmRlY29kZSgnYmFzZTY0JykKKyAgICAgICAgZXhjZXB0IChiaW5hc2NpaS5FcnJvciwgVW5pY29kZUVuY29kZUVycm9yKSwgZXhjOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRlY29kZSBiYXNlNjQgZGF0YTogJXMiICUgZXhjLCBub2RlLnN0YXJ0X21hcmspIAorCisgICAgdGltZXN0YW1wX3JlZ2V4cCA9IHJlLmNvbXBpbGUoCisgICAgICAgICAgICB1cicnJ14oP1A8eWVhcj5bMC05XVswLTldWzAtOV1bMC05XSkKKyAgICAgICAgICAgICAgICAtKD9QPG1vbnRoPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgIC0oP1A8ZGF5PlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgICg/Oig/OltUdF18WyBcdF0rKQorICAgICAgICAgICAgICAgICg/UDxob3VyPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgIDooP1A8bWludXRlPlswLTldWzAtOV0pCisgICAgICAgICAgICAgICAgOig/UDxzZWNvbmQ+WzAtOV1bMC05XSkKKyAgICAgICAgICAgICAgICAoPzpcLig/UDxmcmFjdGlvbj5bMC05XSopKT8KKyAgICAgICAgICAgICAgICAoPzpbIFx0XSooP1A8dHo+WnwoP1A8dHpfc2lnbj5bLStdKSg/UDx0el9ob3VyPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgICg/OjooP1A8dHpfbWludXRlPlswLTldWzAtOV0pKT8pKT8pPyQnJycsIHJlLlgpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfdGltZXN0YW1wKHNlbGYsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICBtYXRjaCA9IHNlbGYudGltZXN0YW1wX3JlZ2V4cC5tYXRjaChub2RlLnZhbHVlKQorICAgICAgICB2YWx1ZXMgPSBtYXRjaC5ncm91cGRpY3QoKQorICAgICAgICB5ZWFyID0gaW50KHZhbHVlc1sneWVhciddKQorICAgICAgICBtb250aCA9IGludCh2YWx1ZXNbJ21vbnRoJ10pCisgICAgICAgIGRheSA9IGludCh2YWx1ZXNbJ2RheSddKQorICAgICAgICBpZiBub3QgdmFsdWVzWydob3VyJ106CisgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgZGF5KQorICAgICAgICBob3VyID0gaW50KHZhbHVlc1snaG91ciddKQorICAgICAgICBtaW51dGUgPSBpbnQodmFsdWVzWydtaW51dGUnXSkKKyAgICAgICAgc2Vjb25kID0gaW50KHZhbHVlc1snc2Vjb25kJ10pCisgICAgICAgIGZyYWN0aW9uID0gMAorICAgICAgICBpZiB2YWx1ZXNbJ2ZyYWN0aW9uJ106CisgICAgICAgICAgICBmcmFjdGlvbiA9IHZhbHVlc1snZnJhY3Rpb24nXVs6Nl0KKyAgICAgICAgICAgIHdoaWxlIGxlbihmcmFjdGlvbikgPCA2OgorICAgICAgICAgICAgICAgIGZyYWN0aW9uICs9ICcwJworICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnQoZnJhY3Rpb24pCisgICAgICAgIGRlbHRhID0gTm9uZQorICAgICAgICBpZiB2YWx1ZXNbJ3R6X3NpZ24nXToKKyAgICAgICAgICAgIHR6X2hvdXIgPSBpbnQodmFsdWVzWyd0el9ob3VyJ10pCisgICAgICAgICAgICB0el9taW51dGUgPSBpbnQodmFsdWVzWyd0el9taW51dGUnXSBvciAwKQorICAgICAgICAgICAgZGVsdGEgPSBkYXRldGltZS50aW1lZGVsdGEoaG91cnM9dHpfaG91ciwgbWludXRlcz10el9taW51dGUpCisgICAgICAgICAgICBpZiB2YWx1ZXNbJ3R6X3NpZ24nXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKKyAgICAgICAgZGF0YSA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikKKyAgICAgICAgaWYgZGVsdGE6CisgICAgICAgICAgICBkYXRhIC09IGRlbHRhCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfb21hcChzZWxmLCBub2RlKToKKyAgICAgICAgIyBOb3RlOiB3ZSBkbyBub3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBrZXlzLCBiZWNhdXNlIGl0J3MgdG9vCisgICAgICAgICMgQ1BVLWV4cGVuc2l2ZS4KKyAgICAgICAgb21hcCA9IFtdCisgICAgICAgIHlpZWxkIG9tYXAKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhbiBvcmRlcmVkIG1hcCIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2VxdWVuY2UsIGJ1dCBmb3VuZCAlcyIgJSBub2RlLmlkLCBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIGZvciBzdWJub2RlIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdWJub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGFuIG9yZGVyZWQgbWFwIiwgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgbWFwcGluZyBvZiBsZW5ndGggMSwgYnV0IGZvdW5kICVzIiAlIHN1Ym5vZGUuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJub2RlLnN0YXJ0X21hcmspCisgICAgICAgICAgICBpZiBsZW4oc3Vibm9kZS52YWx1ZSkgIT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gb3JkZXJlZCBtYXAiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzaW5nbGUgbWFwcGluZyBpdGVtLCBidXQgZm91bmQgJWQgaXRlbXMiICUgbGVuKHN1Ym5vZGUudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vibm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAga2V5X25vZGUsIHZhbHVlX25vZGUgPSBzdWJub2RlLnZhbHVlWzBdCisgICAgICAgICAgICBrZXkgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3Qoa2V5X25vZGUpCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X29iamVjdCh2YWx1ZV9ub2RlKQorICAgICAgICAgICAgb21hcC5hcHBlbmQoKGtleSwgdmFsdWUpKQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX3BhaXJzKHNlbGYsIG5vZGUpOgorICAgICAgICAjIE5vdGU6IHRoZSBzYW1lIGNvZGUgYXMgYGNvbnN0cnVjdF95YW1sX29tYXBgLgorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIHlpZWxkIHBhaXJzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgcGFpcnMiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHNlcXVlbmNlLCBidXQgZm91bmQgJXMiICUgbm9kZS5pZCwgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICBmb3Igc3Vibm9kZSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3Vibm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBwYWlycyIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIG1hcHBpbmcgb2YgbGVuZ3RoIDEsIGJ1dCBmb3VuZCAlcyIgJSBzdWJub2RlLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vibm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAgaWYgbGVuKHN1Ym5vZGUudmFsdWUpICE9IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIHBhaXJzIiwgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlIG1hcHBpbmcgaXRlbSwgYnV0IGZvdW5kICVkIGl0ZW1zIiAlIGxlbihzdWJub2RlLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGtleV9ub2RlLCB2YWx1ZV9ub2RlID0gc3Vibm9kZS52YWx1ZVswXQorICAgICAgICAgICAga2V5ID0gc2VsZi5jb25zdHJ1Y3Rfb2JqZWN0KGtleV9ub2RlKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3QodmFsdWVfbm9kZSkKKyAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfc2V0KHNlbGYsIG5vZGUpOgorICAgICAgICBkYXRhID0gc2V0KCkKKyAgICAgICAgeWllbGQgZGF0YQorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X21hcHBpbmcobm9kZSkKKyAgICAgICAgZGF0YS51cGRhdGUodmFsdWUpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfc3RyKHNlbGYsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUuZW5jb2RlKCdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9zZXEoc2VsZiwgbm9kZSk6CisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB5aWVsZCBkYXRhCisgICAgICAgIGRhdGEuZXh0ZW5kKHNlbGYuY29uc3RydWN0X3NlcXVlbmNlKG5vZGUpKQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX21hcChzZWxmLCBub2RlKToKKyAgICAgICAgZGF0YSA9IHt9CisgICAgICAgIHlpZWxkIGRhdGEKKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUpCisgICAgICAgIGRhdGEudXBkYXRlKHZhbHVlKQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX29iamVjdChzZWxmLCBub2RlLCBjbHMpOgorICAgICAgICBkYXRhID0gY2xzLl9fbmV3X18oY2xzKQorICAgICAgICB5aWVsZCBkYXRhCisgICAgICAgIGlmIGhhc2F0dHIoZGF0YSwgJ19fc2V0c3RhdGVfXycpOgorICAgICAgICAgICAgc3RhdGUgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUsIGRlZXA9VHJ1ZSkKKyAgICAgICAgICAgIGRhdGEuX19zZXRzdGF0ZV9fKHN0YXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdGUgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUpCisgICAgICAgICAgICBkYXRhLl9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfdW5kZWZpbmVkKHNlbGYsIG5vZGUpOgorICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBkZXRlcm1pbmUgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhZyAlciIgJSBub2RlLnRhZy5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLAorICAgICAgICBTYWZlQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfbnVsbCkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2Jvb2wpCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6aW50JywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2ludCkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9mbG9hdCkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLAorICAgICAgICBTYWZlQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfYmluYXJ5KQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF90aW1lc3RhbXApCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9vbWFwKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX3BhaXJzKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnNldCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9zZXQpCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6c3RyJywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX3N0cikKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLAorICAgICAgICBTYWZlQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfc2VxKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9tYXApCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoTm9uZSwKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF91bmRlZmluZWQpCisKK2NsYXNzIENvbnN0cnVjdG9yKFNhZmVDb25zdHJ1Y3Rvcik6CisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9zdHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkuZW5jb2RlKCd1dGYtOCcpCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl91bmljb2RlKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9sb25nKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gbG9uZyhzZWxmLmNvbnN0cnVjdF95YW1sX2ludChub2RlKSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX2NvbXBsZXgoc2VsZiwgbm9kZSk6CisgICAgICAgcmV0dXJuIGNvbXBsZXgoc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpKQorCisgICAgZGVmIGNvbnN0cnVjdF9weXRob25fdHVwbGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiB0dXBsZShzZWxmLmNvbnN0cnVjdF9zZXF1ZW5jZShub2RlKSkKKworICAgIGRlZiBmaW5kX3B5dGhvbl9tb2R1bGUoc2VsZiwgbmFtZSwgbWFyayk6CisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG1vZHVsZSIsIG1hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub24tZW1wdHkgbmFtZSBhcHBlbmRlZCB0byB0aGUgdGFnIiwgbWFyaykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhIFB5dGhvbiBtb2R1bGUiLCBtYXJrLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGZpbmQgbW9kdWxlICVyICglcykiICUgKG5hbWUuZW5jb2RlKCd1dGYtOCcpLCBleGMpLCBtYXJrKQorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KKworICAgIGRlZiBmaW5kX3B5dGhvbl9uYW1lKHNlbGYsIG5hbWUsIG1hcmspOgorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhIFB5dGhvbiBvYmplY3QiLCBtYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm9uLWVtcHR5IG5hbWUgYXBwZW5kZWQgdG8gdGhlIHRhZyIsIG1hcmspCisgICAgICAgIGlmIHUnLicgaW4gbmFtZToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lLCBvYmplY3RfbmFtZSA9IG5hbWUucnNwbGl0KCcuJywgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gJ19fYnVpbHRpbl9fJworICAgICAgICAgICAgb2JqZWN0X25hbWUgPSBuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlX25hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXhjOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG9iamVjdCIsIG1hcmssCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZmluZCBtb2R1bGUgJXIgKCVzKSIgJSAobW9kdWxlX25hbWUuZW5jb2RlKCd1dGYtOCcpLCBleGMpLCBtYXJrKQorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKyAgICAgICAgaWYgbm90IGhhc2F0dHIobW9kdWxlLCBvYmplY3RfbmFtZSk6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBQeXRob24gb2JqZWN0IiwgbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kICVyIGluIHRoZSBtb2R1bGUgJXIiICUgKG9iamVjdF9uYW1lLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5fX25hbWVfXyksIG1hcmspCisgICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgb2JqZWN0X25hbWUpCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9uYW1lKHNlbGYsIHN1ZmZpeCwgbm9kZSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG5hbWUiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0aGUgZW1wdHkgdmFsdWUsIGJ1dCBmb3VuZCAlciIgJSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9weXRob25fbmFtZShzdWZmaXgsIG5vZGUuc3RhcnRfbWFyaykKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX21vZHVsZShzZWxmLCBzdWZmaXgsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhIFB5dGhvbiBtb2R1bGUiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0aGUgZW1wdHkgdmFsdWUsIGJ1dCBmb3VuZCAlciIgJSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9weXRob25fbW9kdWxlKHN1ZmZpeCwgbm9kZS5zdGFydF9tYXJrKQorCisgICAgY2xhc3MgY2xhc3NvYmo6IHBhc3MKKworICAgIGRlZiBtYWtlX3B5dGhvbl9pbnN0YW5jZShzZWxmLCBzdWZmaXgsIG5vZGUsCisgICAgICAgICAgICBhcmdzPU5vbmUsIGt3ZHM9Tm9uZSwgbmV3b2JqPUZhbHNlKToKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBhcmdzID0gW10KKyAgICAgICAgaWYgbm90IGt3ZHM6CisgICAgICAgICAgICBrd2RzID0ge30KKyAgICAgICAgY2xzID0gc2VsZi5maW5kX3B5dGhvbl9uYW1lKHN1ZmZpeCwgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICBpZiBuZXdvYmogYW5kIGlzaW5zdGFuY2UoY2xzLCB0eXBlKHNlbGYuY2xhc3NvYmopKSAgXAorICAgICAgICAgICAgICAgIGFuZCBub3QgYXJncyBhbmQgbm90IGt3ZHM6CisgICAgICAgICAgICBpbnN0YW5jZSA9IHNlbGYuY2xhc3NvYmooKQorICAgICAgICAgICAgaW5zdGFuY2UuX19jbGFzc19fID0gY2xzCisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UKKyAgICAgICAgZWxpZiBuZXdvYmogYW5kIGlzaW5zdGFuY2UoY2xzLCB0eXBlKToKKyAgICAgICAgICAgIHJldHVybiBjbHMuX19uZXdfXyhjbHMsICphcmdzLCAqKmt3ZHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2xzKCphcmdzLCAqKmt3ZHMpCisKKyAgICBkZWYgc2V0X3B5dGhvbl9pbnN0YW5jZV9zdGF0ZShzZWxmLCBpbnN0YW5jZSwgc3RhdGUpOgorICAgICAgICBpZiBoYXNhdHRyKGluc3RhbmNlLCAnX19zZXRzdGF0ZV9fJyk6CisgICAgICAgICAgICBpbnN0YW5jZS5fX3NldHN0YXRlX18oc3RhdGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzbG90c3RhdGUgPSB7fQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGF0ZSwgdHVwbGUpIGFuZCBsZW4oc3RhdGUpID09IDI6CisgICAgICAgICAgICAgICAgc3RhdGUsIHNsb3RzdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICBpZiBoYXNhdHRyKGluc3RhbmNlLCAnX19kaWN0X18nKToKKyAgICAgICAgICAgICAgICBpbnN0YW5jZS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpCisgICAgICAgICAgICBlbGlmIHN0YXRlOgorICAgICAgICAgICAgICAgIHNsb3RzdGF0ZS51cGRhdGUoc3RhdGUpCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzbG90c3RhdGUuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKG9iamVjdCwga2V5LCB2YWx1ZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX29iamVjdChzZWxmLCBzdWZmaXgsIG5vZGUpOgorICAgICAgICAjIEZvcm1hdDoKKyAgICAgICAgIyAgICEhcHl0aG9uL29iamVjdDptb2R1bGUubmFtZSB7IC4uLiBzdGF0ZSAuLi4gfQorICAgICAgICBpbnN0YW5jZSA9IHNlbGYubWFrZV9weXRob25faW5zdGFuY2Uoc3VmZml4LCBub2RlLCBuZXdvYmo9VHJ1ZSkKKyAgICAgICAgeWllbGQgaW5zdGFuY2UKKyAgICAgICAgZGVlcCA9IGhhc2F0dHIoaW5zdGFuY2UsICdfX3NldHN0YXRlX18nKQorICAgICAgICBzdGF0ZSA9IHNlbGYuY29uc3RydWN0X21hcHBpbmcobm9kZSwgZGVlcD1kZWVwKQorICAgICAgICBzZWxmLnNldF9weXRob25faW5zdGFuY2Vfc3RhdGUoaW5zdGFuY2UsIHN0YXRlKQorCisgICAgZGVmIGNvbnN0cnVjdF9weXRob25fb2JqZWN0X2FwcGx5KHNlbGYsIHN1ZmZpeCwgbm9kZSwgbmV3b2JqPUZhbHNlKToKKyAgICAgICAgIyBGb3JtYXQ6CisgICAgICAgICMgICAhIXB5dGhvbi9vYmplY3QvYXBwbHkgICAgICAgIyAob3IgISFweXRob24vb2JqZWN0L25ldykKKyAgICAgICAgIyAgIGFyZ3M6IFsgLi4uIGFyZ3VtZW50cyAuLi4gXQorICAgICAgICAjICAga3dkczogeyAuLi4ga2V5d29yZHMgLi4uIH0KKyAgICAgICAgIyAgIHN0YXRlOiAuLi4gc3RhdGUgLi4uCisgICAgICAgICMgICBsaXN0aXRlbXM6IFsgLi4uIGxpc3RpdGVtcyAuLi4gXQorICAgICAgICAjICAgZGljdGl0ZW1zOiB7IC4uLiBkaWN0aXRlbXMgLi4uIH0KKyAgICAgICAgIyBvciBzaG9ydCBmb3JtYXQ6CisgICAgICAgICMgICAhIXB5dGhvbi9vYmplY3QvYXBwbHkgWyAuLi4gYXJndW1lbnRzIC4uLiBdCisgICAgICAgICMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAhIXB5dGhvbi9vYmplY3QvYXBwbHkgYW5kICEhcHl0aG9uL29iamVjdC9uZXcKKyAgICAgICAgIyBpcyBob3cgYW4gb2JqZWN0IGlzIGNyZWF0ZWQsIGNoZWNrIG1ha2VfcHl0aG9uX2luc3RhbmNlIGZvciBkZXRhaWxzLgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICBhcmdzID0gc2VsZi5jb25zdHJ1Y3Rfc2VxdWVuY2Uobm9kZSwgZGVlcD1UcnVlKQorICAgICAgICAgICAga3dkcyA9IHt9CisgICAgICAgICAgICBzdGF0ZSA9IHt9CisgICAgICAgICAgICBsaXN0aXRlbXMgPSBbXQorICAgICAgICAgICAgZGljdGl0ZW1zID0ge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3RfbWFwcGluZyhub2RlLCBkZWVwPVRydWUpCisgICAgICAgICAgICBhcmdzID0gdmFsdWUuZ2V0KCdhcmdzJywgW10pCisgICAgICAgICAgICBrd2RzID0gdmFsdWUuZ2V0KCdrd2RzJywge30pCisgICAgICAgICAgICBzdGF0ZSA9IHZhbHVlLmdldCgnc3RhdGUnLCB7fSkKKyAgICAgICAgICAgIGxpc3RpdGVtcyA9IHZhbHVlLmdldCgnbGlzdGl0ZW1zJywgW10pCisgICAgICAgICAgICBkaWN0aXRlbXMgPSB2YWx1ZS5nZXQoJ2RpY3RpdGVtcycsIHt9KQorICAgICAgICBpbnN0YW5jZSA9IHNlbGYubWFrZV9weXRob25faW5zdGFuY2Uoc3VmZml4LCBub2RlLCBhcmdzLCBrd2RzLCBuZXdvYmopCisgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgc2VsZi5zZXRfcHl0aG9uX2luc3RhbmNlX3N0YXRlKGluc3RhbmNlLCBzdGF0ZSkKKyAgICAgICAgaWYgbGlzdGl0ZW1zOgorICAgICAgICAgICAgaW5zdGFuY2UuZXh0ZW5kKGxpc3RpdGVtcykKKyAgICAgICAgaWYgZGljdGl0ZW1zOgorICAgICAgICAgICAgZm9yIGtleSBpbiBkaWN0aXRlbXM6CisgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IGRpY3RpdGVtc1trZXldCisgICAgICAgIHJldHVybiBpbnN0YW5jZQorCisgICAgZGVmIGNvbnN0cnVjdF9weXRob25fb2JqZWN0X25ldyhzZWxmLCBzdWZmaXgsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3RfcHl0aG9uX29iamVjdF9hcHBseShzdWZmaXgsIG5vZGUsIG5ld29iaj1UcnVlKQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vbm9uZScsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfbnVsbCkKKworQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL2Jvb2wnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2Jvb2wpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9zdHInLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF9weXRob25fc3RyKQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vdW5pY29kZScsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl91bmljb2RlKQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vaW50JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9pbnQpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9sb25nJywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX2xvbmcpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9mbG9hdCcsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfZmxvYXQpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9jb21wbGV4JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX2NvbXBsZXgpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9saXN0JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9zZXEpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi90dXBsZScsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl90dXBsZSkKKworQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL2RpY3QnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX21hcCkKKworQ29uc3RydWN0b3IuYWRkX211bHRpX2NvbnN0cnVjdG9yKAorICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL25hbWU6JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX25hbWUpCisKK0NvbnN0cnVjdG9yLmFkZF9tdWx0aV9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9tb2R1bGU6JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX21vZHVsZSkKKworQ29uc3RydWN0b3IuYWRkX211bHRpX2NvbnN0cnVjdG9yKAorICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdDonLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF9weXRob25fb2JqZWN0KQorCitDb25zdHJ1Y3Rvci5hZGRfbXVsdGlfY29uc3RydWN0b3IoCisgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vb2JqZWN0L2FwcGx5OicsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl9vYmplY3RfYXBwbHkpCisKK0NvbnN0cnVjdG9yLmFkZF9tdWx0aV9jb25zdHJ1Y3RvcigKKyAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9vYmplY3QvbmV3OicsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl9vYmplY3RfbmV3KQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9jeWFtbC5weSBiL2xpYi95YW1sL2N5YW1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGNkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9jeWFtbC5weQpAQCAtMCwwICsxLDg1IEBACisKK19fYWxsX18gPSBbJ0NCYXNlTG9hZGVyJywgJ0NTYWZlTG9hZGVyJywgJ0NMb2FkZXInLAorICAgICAgICAnQ0Jhc2VEdW1wZXInLCAnQ1NhZmVEdW1wZXInLCAnQ0R1bXBlciddCisKK2Zyb20gX3lhbWwgaW1wb3J0IENQYXJzZXIsIENFbWl0dGVyCisKK2Zyb20gY29uc3RydWN0b3IgaW1wb3J0ICoKKworZnJvbSBzZXJpYWxpemVyIGltcG9ydCAqCitmcm9tIHJlcHJlc2VudGVyIGltcG9ydCAqCisKK2Zyb20gcmVzb2x2ZXIgaW1wb3J0ICoKKworY2xhc3MgQ0Jhc2VMb2FkZXIoQ1BhcnNlciwgQmFzZUNvbnN0cnVjdG9yLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBCYXNlQ29uc3RydWN0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgQmFzZVJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKK2NsYXNzIENTYWZlTG9hZGVyKENQYXJzZXIsIFNhZmVDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBTYWZlQ29uc3RydWN0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgQ0xvYWRlcihDUGFyc2VyLCBDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBDQmFzZUR1bXBlcihDRW1pdHRlciwgQmFzZVJlcHJlc2VudGVyLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwKKyAgICAgICAgICAgIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUsCisgICAgICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsIGV4cGxpY2l0X3N0YXJ0PU5vbmUsIGV4cGxpY2l0X2VuZD1Ob25lLAorICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBDRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBSZXByZXNlbnRlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9mbG93X3N0eWxlPWRlZmF1bHRfZmxvd19zdHlsZSkKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgQ1NhZmVEdW1wZXIoQ0VtaXR0ZXIsIFNhZmVSZXByZXNlbnRlciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwKKyAgICAgICAgICAgIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUsCisgICAgICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsIGV4cGxpY2l0X3N0YXJ0PU5vbmUsIGV4cGxpY2l0X2VuZD1Ob25lLAorICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBDRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBTYWZlUmVwcmVzZW50ZXIuX19pbml0X18oc2VsZiwgZGVmYXVsdF9zdHlsZT1kZWZhdWx0X3N0eWxlLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfZmxvd19zdHlsZT1kZWZhdWx0X2Zsb3dfc3R5bGUpCisgICAgICAgIFJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKK2NsYXNzIENEdW1wZXIoQ0VtaXR0ZXIsIFNlcmlhbGl6ZXIsIFJlcHJlc2VudGVyLCBSZXNvbHZlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLAorICAgICAgICAgICAgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSwKKyAgICAgICAgICAgIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHRhZ3M9Tm9uZSk6CisgICAgICAgIENFbWl0dGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgY2Fub25pY2FsPWNhbm9uaWNhbCwKKyAgICAgICAgICAgICAgICBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWssCisgICAgICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgIFJlcHJlc2VudGVyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9kdW1wZXIucHkgYi9saWIveWFtbC9kdW1wZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi95YW1sL2R1bXBlci5weQpAQCAtMCwwICsxLDYyIEBACisKK19fYWxsX18gPSBbJ0Jhc2VEdW1wZXInLCAnU2FmZUR1bXBlcicsICdEdW1wZXInXQorCitmcm9tIGVtaXR0ZXIgaW1wb3J0ICoKK2Zyb20gc2VyaWFsaXplciBpbXBvcnQgKgorZnJvbSByZXByZXNlbnRlciBpbXBvcnQgKgorZnJvbSByZXNvbHZlciBpbXBvcnQgKgorCitjbGFzcyBCYXNlRHVtcGVyKEVtaXR0ZXIsIFNlcmlhbGl6ZXIsIEJhc2VSZXByZXNlbnRlciwgQmFzZVJlc29sdmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sCisgICAgICAgICAgICBkZWZhdWx0X3N0eWxlPU5vbmUsIGRlZmF1bHRfZmxvd19zdHlsZT1Ob25lLAorICAgICAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1Ob25lLCBsaW5lX2JyZWFrPU5vbmUsCisgICAgICAgICAgICBlbmNvZGluZz1Ob25lLCBleHBsaWNpdF9zdGFydD1Ob25lLCBleHBsaWNpdF9lbmQ9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsCisgICAgICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWspCisgICAgICAgIFNlcmlhbGl6ZXIuX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgIFJlcHJlc2VudGVyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBTYWZlRHVtcGVyKEVtaXR0ZXIsIFNlcmlhbGl6ZXIsIFNhZmVSZXByZXNlbnRlciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwKKyAgICAgICAgICAgIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUsCisgICAgICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsIGV4cGxpY2l0X3N0YXJ0PU5vbmUsIGV4cGxpY2l0X2VuZD1Ob25lLAorICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBFbWl0dGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgY2Fub25pY2FsPWNhbm9uaWNhbCwKKyAgICAgICAgICAgICAgICBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwKKyAgICAgICAgICAgICAgICBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUsIGxpbmVfYnJlYWs9bGluZV9icmVhaykKKyAgICAgICAgU2VyaWFsaXplci5fX2luaXRfXyhzZWxmLCBlbmNvZGluZz1lbmNvZGluZywKKyAgICAgICAgICAgICAgICBleHBsaWNpdF9zdGFydD1leHBsaWNpdF9zdGFydCwgZXhwbGljaXRfZW5kPWV4cGxpY2l0X2VuZCwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24sIHRhZ3M9dGFncykKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBEdW1wZXIoRW1pdHRlciwgU2VyaWFsaXplciwgUmVwcmVzZW50ZXIsIFJlc29sdmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sCisgICAgICAgICAgICBkZWZhdWx0X3N0eWxlPU5vbmUsIGRlZmF1bHRfZmxvd19zdHlsZT1Ob25lLAorICAgICAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1Ob25lLCBsaW5lX2JyZWFrPU5vbmUsCisgICAgICAgICAgICBlbmNvZGluZz1Ob25lLCBleHBsaWNpdF9zdGFydD1Ob25lLCBleHBsaWNpdF9lbmQ9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsCisgICAgICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWspCisgICAgICAgIFNlcmlhbGl6ZXIuX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgIFJlcHJlc2VudGVyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9lbWl0dGVyLnB5IGIvbGliL3lhbWwvZW1pdHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJjZGNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvZW1pdHRlci5weQpAQCAtMCwwICsxLDExNDAgQEAKKworIyBFbWl0dGVyIGV4cGVjdHMgZXZlbnRzIG9iZXlpbmcgdGhlIGZvbGxvd2luZyBncmFtbWFyOgorIyBzdHJlYW0gOjo9IFNUUkVBTS1TVEFSVCBkb2N1bWVudCogU1RSRUFNLUVORAorIyBkb2N1bWVudCA6Oj0gRE9DVU1FTlQtU1RBUlQgbm9kZSBET0NVTUVOVC1FTkQKKyMgbm9kZSA6Oj0gU0NBTEFSIHwgc2VxdWVuY2UgfCBtYXBwaW5nCisjIHNlcXVlbmNlIDo6PSBTRVFVRU5DRS1TVEFSVCBub2RlKiBTRVFVRU5DRS1FTkQKKyMgbWFwcGluZyA6Oj0gTUFQUElORy1TVEFSVCAobm9kZSBub2RlKSogTUFQUElORy1FTkQKKworX19hbGxfXyA9IFsnRW1pdHRlcicsICdFbWl0dGVyRXJyb3InXQorCitmcm9tIGVycm9yIGltcG9ydCBZQU1MRXJyb3IKK2Zyb20gZXZlbnRzIGltcG9ydCAqCisKK2NsYXNzIEVtaXR0ZXJFcnJvcihZQU1MRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgU2NhbGFyQW5hbHlzaXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NhbGFyLCBlbXB0eSwgbXVsdGlsaW5lLAorICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbiwgYWxsb3dfYmxvY2tfcGxhaW4sCisgICAgICAgICAgICBhbGxvd19zaW5nbGVfcXVvdGVkLCBhbGxvd19kb3VibGVfcXVvdGVkLAorICAgICAgICAgICAgYWxsb3dfYmxvY2spOgorICAgICAgICBzZWxmLnNjYWxhciA9IHNjYWxhcgorICAgICAgICBzZWxmLmVtcHR5ID0gZW1wdHkKKyAgICAgICAgc2VsZi5tdWx0aWxpbmUgPSBtdWx0aWxpbmUKKyAgICAgICAgc2VsZi5hbGxvd19mbG93X3BsYWluID0gYWxsb3dfZmxvd19wbGFpbgorICAgICAgICBzZWxmLmFsbG93X2Jsb2NrX3BsYWluID0gYWxsb3dfYmxvY2tfcGxhaW4KKyAgICAgICAgc2VsZi5hbGxvd19zaW5nbGVfcXVvdGVkID0gYWxsb3dfc2luZ2xlX3F1b3RlZAorICAgICAgICBzZWxmLmFsbG93X2RvdWJsZV9xdW90ZWQgPSBhbGxvd19kb3VibGVfcXVvdGVkCisgICAgICAgIHNlbGYuYWxsb3dfYmxvY2sgPSBhbGxvd19ibG9jaworCitjbGFzcyBFbWl0dGVyKG9iamVjdCk6CisKKyAgICBERUZBVUxUX1RBR19QUkVGSVhFUyA9IHsKKyAgICAgICAgdSchJyA6IHUnIScsCisgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6JyA6IHUnISEnLAorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lKToKKworICAgICAgICAjIFRoZSBzdHJlYW0gc2hvdWxkIGhhdmUgdGhlIG1ldGhvZHMgYHdyaXRlYCBhbmQgcG9zc2libHkgYGZsdXNoYC4KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgICAgICAjIEVuY29kaW5nIGNhbiBiZSBvdmVycmlkZW4gYnkgU1RSRUFNLVNUQVJULgorICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQorCisgICAgICAgICMgRW1pdHRlciBpcyBhIHN0YXRlIG1hY2hpbmUgd2l0aCBhIHN0YWNrIG9mIHN0YXRlcyB0byBoYW5kbGUgbmVzdGVkCisgICAgICAgICMgc3RydWN0dXJlcy4KKyAgICAgICAgc2VsZi5zdGF0ZXMgPSBbXQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5leHBlY3Rfc3RyZWFtX3N0YXJ0CisKKyAgICAgICAgIyBDdXJyZW50IGV2ZW50IGFuZCB0aGUgZXZlbnQgcXVldWUuCisgICAgICAgIHNlbGYuZXZlbnRzID0gW10KKyAgICAgICAgc2VsZi5ldmVudCA9IE5vbmUKKworICAgICAgICAjIFRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsIGFuZCB0aGUgc3RhY2sgb2YgcHJldmlvdXMgaW5kZW50cy4KKyAgICAgICAgc2VsZi5pbmRlbnRzID0gW10KKyAgICAgICAgc2VsZi5pbmRlbnQgPSBOb25lCisKKyAgICAgICAgIyBGbG93IGxldmVsLgorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgPSAwCisKKyAgICAgICAgIyBDb250ZXh0cy4KKyAgICAgICAgc2VsZi5yb290X2NvbnRleHQgPSBGYWxzZQorICAgICAgICBzZWxmLnNlcXVlbmNlX2NvbnRleHQgPSBGYWxzZQorICAgICAgICBzZWxmLm1hcHBpbmdfY29udGV4dCA9IEZhbHNlCisgICAgICAgIHNlbGYuc2ltcGxlX2tleV9jb250ZXh0ID0gRmFsc2UKKworICAgICAgICAjIENoYXJhY3RlcmlzdGljcyBvZiB0aGUgbGFzdCBlbWl0dGVkIGNoYXJhY3RlcjoKKyAgICAgICAgIyAgLSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICAjICAtIGlzIGl0IGEgd2hpdGVzcGFjZT8KKyAgICAgICAgIyAgLSBpcyBpdCBhbiBpbmRlbnRpb24gY2hhcmFjdGVyCisgICAgICAgICMgICAgKGluZGVudGF0aW9uIHNwYWNlLCAnLScsICc/Jywgb3IgJzonKT8KKyAgICAgICAgc2VsZi5saW5lID0gMAorICAgICAgICBzZWxmLmNvbHVtbiA9IDAKKyAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gVHJ1ZQorICAgICAgICBzZWxmLmluZGVudGlvbiA9IFRydWUKKworICAgICAgICAjIFdoZXRoZXIgdGhlIGRvY3VtZW50IHJlcXVpcmVzIGFuIGV4cGxpY2l0IGRvY3VtZW50IGluZGljYXRvcgorICAgICAgICBzZWxmLm9wZW5fZW5kZWQgPSBGYWxzZQorCisgICAgICAgICMgRm9ybWF0dGluZyBkZXRhaWxzLgorICAgICAgICBzZWxmLmNhbm9uaWNhbCA9IGNhbm9uaWNhbAorICAgICAgICBzZWxmLmFsbG93X3VuaWNvZGUgPSBhbGxvd191bmljb2RlCisgICAgICAgIHNlbGYuYmVzdF9pbmRlbnQgPSAyCisgICAgICAgIGlmIGluZGVudCBhbmQgMSA8IGluZGVudCA8IDEwOgorICAgICAgICAgICAgc2VsZi5iZXN0X2luZGVudCA9IGluZGVudAorICAgICAgICBzZWxmLmJlc3Rfd2lkdGggPSA4MAorICAgICAgICBpZiB3aWR0aCBhbmQgd2lkdGggPiBzZWxmLmJlc3RfaW5kZW50KjI6CisgICAgICAgICAgICBzZWxmLmJlc3Rfd2lkdGggPSB3aWR0aAorICAgICAgICBzZWxmLmJlc3RfbGluZV9icmVhayA9IHUnXG4nCisgICAgICAgIGlmIGxpbmVfYnJlYWsgaW4gW3UnXHInLCB1J1xuJywgdSdcclxuJ106CisgICAgICAgICAgICBzZWxmLmJlc3RfbGluZV9icmVhayA9IGxpbmVfYnJlYWsKKworICAgICAgICAjIFRhZyBwcmVmaXhlcy4KKyAgICAgICAgc2VsZi50YWdfcHJlZml4ZXMgPSBOb25lCisKKyAgICAgICAgIyBQcmVwYXJlZCBhbmNob3IgYW5kIHRhZy4KKyAgICAgICAgc2VsZi5wcmVwYXJlZF9hbmNob3IgPSBOb25lCisgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gTm9uZQorCisgICAgICAgICMgU2NhbGFyIGFuYWx5c2lzIGFuZCBzdHlsZS4KKyAgICAgICAgc2VsZi5hbmFseXNpcyA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHlsZSA9IE5vbmUKKworICAgIGRlZiBkaXNwb3NlKHNlbGYpOgorICAgICAgICAjIFJlc2V0IHRoZSBzdGF0ZSBhdHRyaWJ1dGVzICh0byBjbGVhciBzZWxmLXJlZmVyZW5jZXMpCisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKKworICAgIGRlZiBlbWl0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKGV2ZW50KQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5uZWVkX21vcmVfZXZlbnRzKCk6CisgICAgICAgICAgICBzZWxmLmV2ZW50ID0gc2VsZi5ldmVudHMucG9wKDApCisgICAgICAgICAgICBzZWxmLnN0YXRlKCkKKyAgICAgICAgICAgIHNlbGYuZXZlbnQgPSBOb25lCisKKyAgICAjIEluIHNvbWUgY2FzZXMsIHdlIHdhaXQgZm9yIGEgZmV3IG5leHQgZXZlbnRzIGJlZm9yZSBlbWl0dGluZy4KKworICAgIGRlZiBuZWVkX21vcmVfZXZlbnRzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5ldmVudHM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBldmVudCA9IHNlbGYuZXZlbnRzWzBdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIERvY3VtZW50U3RhcnRFdmVudCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZWVkX2V2ZW50cygxKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIFNlcXVlbmNlU3RhcnRFdmVudCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZWVkX2V2ZW50cygyKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIE1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5lZWRfZXZlbnRzKDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBuZWVkX2V2ZW50cyhzZWxmLCBjb3VudCk6CisgICAgICAgIGxldmVsID0gMAorICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5ldmVudHNbMTpdOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKERvY3VtZW50U3RhcnRFdmVudCwgQ29sbGVjdGlvblN0YXJ0RXZlbnQpKToKKyAgICAgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIChEb2N1bWVudEVuZEV2ZW50LCBDb2xsZWN0aW9uRW5kRXZlbnQpKToKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIFN0cmVhbUVuZEV2ZW50KToKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC0xCisgICAgICAgICAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiAobGVuKHNlbGYuZXZlbnRzKSA8IGNvdW50KzEpCisKKyAgICBkZWYgaW5jcmVhc2VfaW5kZW50KHNlbGYsIGZsb3c9RmFsc2UsIGluZGVudGxlc3M9RmFsc2UpOgorICAgICAgICBzZWxmLmluZGVudHMuYXBwZW5kKHNlbGYuaW5kZW50KQorICAgICAgICBpZiBzZWxmLmluZGVudCBpcyBOb25lOgorICAgICAgICAgICAgaWYgZmxvdzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuYmVzdF9pbmRlbnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSAwCisgICAgICAgIGVsaWYgbm90IGluZGVudGxlc3M6CisgICAgICAgICAgICBzZWxmLmluZGVudCArPSBzZWxmLmJlc3RfaW5kZW50CisKKyAgICAjIFN0YXRlcy4KKworICAgICMgU3RyZWFtIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9zdHJlYW1fc3RhcnQoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU3RyZWFtU3RhcnRFdmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LmVuY29kaW5nIGFuZCBub3QgZ2V0YXR0cihzZWxmLnN0cmVhbSwgJ2VuY29kaW5nJywgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IHNlbGYuZXZlbnQuZW5jb2RpbmcKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyZWFtX3N0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9kb2N1bWVudF9zdGFydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJleHBlY3RlZCBTdHJlYW1TdGFydEV2ZW50LCBidXQgZ290ICVzIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuZXZlbnQpCisKKyAgICBkZWYgZXhwZWN0X25vdGhpbmcoc2VsZik6CisgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiZXhwZWN0ZWQgbm90aGluZywgYnV0IGdvdCAlcyIgJSBzZWxmLmV2ZW50KQorCisgICAgIyBEb2N1bWVudCBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3RfZmlyc3RfZG9jdW1lbnRfc3RhcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdF9kb2N1bWVudF9zdGFydChmaXJzdD1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9kb2N1bWVudF9zdGFydChzZWxmLCBmaXJzdD1GYWxzZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRTdGFydEV2ZW50KToKKyAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50LnZlcnNpb24gb3Igc2VsZi5ldmVudC50YWdzKSBhbmQgc2VsZi5vcGVuX2VuZGVkOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnLi4uJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LnZlcnNpb246CisgICAgICAgICAgICAgICAgdmVyc2lvbl90ZXh0ID0gc2VsZi5wcmVwYXJlX3ZlcnNpb24oc2VsZi5ldmVudC52ZXJzaW9uKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfdmVyc2lvbl9kaXJlY3RpdmUodmVyc2lvbl90ZXh0KQorICAgICAgICAgICAgc2VsZi50YWdfcHJlZml4ZXMgPSBzZWxmLkRFRkFVTFRfVEFHX1BSRUZJWEVTLmNvcHkoKQorICAgICAgICAgICAgaWYgc2VsZi5ldmVudC50YWdzOgorICAgICAgICAgICAgICAgIGhhbmRsZXMgPSBzZWxmLmV2ZW50LnRhZ3Mua2V5cygpCisgICAgICAgICAgICAgICAgaGFuZGxlcy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgaGFuZGxlIGluIGhhbmRsZXM6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHNlbGYuZXZlbnQudGFnc1toYW5kbGVdCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFnX3ByZWZpeGVzW3ByZWZpeF0gPSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3RleHQgPSBzZWxmLnByZXBhcmVfdGFnX2hhbmRsZShoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgIHByZWZpeF90ZXh0ID0gc2VsZi5wcmVwYXJlX3RhZ19wcmVmaXgocHJlZml4KQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3RhZ19kaXJlY3RpdmUoaGFuZGxlX3RleHQsIHByZWZpeF90ZXh0KQorICAgICAgICAgICAgaW1wbGljaXQgPSAoZmlyc3QgYW5kIG5vdCBzZWxmLmV2ZW50LmV4cGxpY2l0IGFuZCBub3Qgc2VsZi5jYW5vbmljYWwKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmV2ZW50LnZlcnNpb24gYW5kIG5vdCBzZWxmLmV2ZW50LnRhZ3MKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmNoZWNrX2VtcHR5X2RvY3VtZW50KCkpCisgICAgICAgICAgICBpZiBub3QgaW1wbGljaXQ6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnLS0tJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNhbm9uaWNhbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZXhwZWN0X2RvY3VtZW50X3Jvb3QKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFN0cmVhbUVuZEV2ZW50KToKKyAgICAgICAgICAgIGlmIHNlbGYub3Blbl9lbmRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1Jy4uLicsIFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJlYW1fZW5kKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9ub3RoaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoImV4cGVjdGVkIERvY3VtZW50U3RhcnRFdmVudCwgYnV0IGdvdCAlcyIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLmV2ZW50KQorCisgICAgZGVmIGV4cGVjdF9kb2N1bWVudF9lbmQoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRFbmRFdmVudCk6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LmV4cGxpY2l0OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnLi4uJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBzZWxmLmZsdXNoX3N0cmVhbSgpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5leHBlY3RfZG9jdW1lbnRfc3RhcnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiZXhwZWN0ZWQgRG9jdW1lbnRFbmRFdmVudCwgYnV0IGdvdCAlcyIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLmV2ZW50KQorCisgICAgZGVmIGV4cGVjdF9kb2N1bWVudF9yb290KHNlbGYpOgorICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZG9jdW1lbnRfZW5kKQorICAgICAgICBzZWxmLmV4cGVjdF9ub2RlKHJvb3Q9VHJ1ZSkKKworICAgICMgTm9kZSBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3Rfbm9kZShzZWxmLCByb290PUZhbHNlLCBzZXF1ZW5jZT1GYWxzZSwgbWFwcGluZz1GYWxzZSwKKyAgICAgICAgICAgIHNpbXBsZV9rZXk9RmFsc2UpOgorICAgICAgICBzZWxmLnJvb3RfY29udGV4dCA9IHJvb3QKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9jb250ZXh0ID0gc2VxdWVuY2UKKyAgICAgICAgc2VsZi5tYXBwaW5nX2NvbnRleHQgPSBtYXBwaW5nCisgICAgICAgIHNlbGYuc2ltcGxlX2tleV9jb250ZXh0ID0gc2ltcGxlX2tleQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIEFsaWFzRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5leHBlY3RfYWxpYXMoKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgKFNjYWxhckV2ZW50LCBDb2xsZWN0aW9uU3RhcnRFdmVudCkpOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2FuY2hvcih1JyYnKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3RhZygpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNjYWxhckV2ZW50KToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdF9zY2FsYXIoKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNlcXVlbmNlU3RhcnRFdmVudCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mbG93X2xldmVsIG9yIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuZXZlbnQuZmxvd19zdHlsZSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuY2hlY2tfZW1wdHlfc2VxdWVuY2UoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RfZmxvd19zZXF1ZW5jZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RfYmxvY2tfc2VxdWVuY2UoKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIE1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZsb3dfbGV2ZWwgb3Igc2VsZi5jYW5vbmljYWwgb3Igc2VsZi5ldmVudC5mbG93X3N0eWxlICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5jaGVja19lbXB0eV9tYXBwaW5nKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RfYmxvY2tfbWFwcGluZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoImV4cGVjdGVkIE5vZGVFdmVudCwgYnV0IGdvdCAlcyIgJSBzZWxmLmV2ZW50KQorCisgICAgZGVmIGV4cGVjdF9hbGlhcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ldmVudC5hbmNob3IgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiYW5jaG9yIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGFsaWFzIikKKyAgICAgICAgc2VsZi5wcm9jZXNzX2FuY2hvcih1JyonKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKworICAgIGRlZiBleHBlY3Rfc2NhbGFyKHNlbGYpOgorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PVRydWUpCisgICAgICAgIHNlbGYucHJvY2Vzc19zY2FsYXIoKQorICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50cy5wb3AoKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKworICAgICMgRmxvdyBzZXF1ZW5jZSBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3RfZmxvd19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSdbJywgVHJ1ZSwgd2hpdGVzcGFjZT1UcnVlKQorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgKz0gMQorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PVRydWUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9mbG93X3NlcXVlbmNlX2l0ZW0KKworICAgIGRlZiBleHBlY3RfZmlyc3RfZmxvd19zZXF1ZW5jZV9pdGVtKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuZmxvd19sZXZlbCAtPSAxCisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1J10nLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jYW5vbmljYWwgb3Igc2VsZi5jb2x1bW4gPiBzZWxmLmJlc3Rfd2lkdGg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfc2VxdWVuY2VfaXRlbSkKKyAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUoc2VxdWVuY2U9VHJ1ZSkKKworICAgIGRlZiBleHBlY3RfZmxvd19zZXF1ZW5jZV9pdGVtKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuZmxvd19sZXZlbCAtPSAxCisgICAgICAgICAgICBpZiBzZWxmLmNhbm9uaWNhbDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1JywnLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1J10nLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodScsJywgRmFsc2UpCisgICAgICAgICAgICBpZiBzZWxmLmNhbm9uaWNhbCBvciBzZWxmLmNvbHVtbiA+IHNlbGYuYmVzdF93aWR0aDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19zZXF1ZW5jZV9pdGVtKQorICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShzZXF1ZW5jZT1UcnVlKQorCisgICAgIyBGbG93IG1hcHBpbmcgaGFuZGxlcnMuCisKKyAgICBkZWYgZXhwZWN0X2Zsb3dfbWFwcGluZyhzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSd7JywgVHJ1ZSwgd2hpdGVzcGFjZT1UcnVlKQorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgKz0gMQorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PVRydWUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9mbG93X21hcHBpbmdfa2V5CisKKyAgICBkZWYgZXhwZWN0X2ZpcnN0X2Zsb3dfbWFwcGluZ19rZXkoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgTWFwcGluZ0VuZEV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnRzLnBvcCgpCisgICAgICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgLT0gMQorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSd9JywgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNhbm9uaWNhbCBhbmQgc2VsZi5jaGVja19zaW1wbGVfa2V5KCk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZ19zaW1wbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUsIHNpbXBsZV9rZXk9VHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSc/JywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9mbG93X21hcHBpbmdfa2V5KHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIE1hcHBpbmdFbmRFdmVudCk6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgc2VsZi5mbG93X2xldmVsIC09IDEKKyAgICAgICAgICAgIGlmIHNlbGYuY2Fub25pY2FsOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnLCcsIEZhbHNlKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnfScsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1JywnLCBGYWxzZSkKKyAgICAgICAgICAgIGlmIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNhbm9uaWNhbCBhbmQgc2VsZi5jaGVja19zaW1wbGVfa2V5KCk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZ19zaW1wbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUsIHNpbXBsZV9rZXk9VHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSc/JywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9mbG93X21hcHBpbmdfc2ltcGxlX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1JzonLCBGYWxzZSkKKyAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZ19rZXkpCisgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9mbG93X21hcHBpbmdfdmFsdWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1JzonLCBUcnVlKQorICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX2tleSkKKyAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICAjIEJsb2NrIHNlcXVlbmNlIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9ibG9ja19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgaW5kZW50bGVzcyA9IChzZWxmLm1hcHBpbmdfY29udGV4dCBhbmQgbm90IHNlbGYuaW5kZW50aW9uKQorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PUZhbHNlLCBpbmRlbnRsZXNzPWluZGVudGxlc3MpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9ibG9ja19zZXF1ZW5jZV9pdGVtCisKKyAgICBkZWYgZXhwZWN0X2ZpcnN0X2Jsb2NrX3NlcXVlbmNlX2l0ZW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdF9ibG9ja19zZXF1ZW5jZV9pdGVtKGZpcnN0PVRydWUpCisKKyAgICBkZWYgZXhwZWN0X2Jsb2NrX3NlcXVlbmNlX2l0ZW0oc2VsZiwgZmlyc3Q9RmFsc2UpOgorICAgICAgICBpZiBub3QgZmlyc3QgYW5kIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2VxdWVuY2VFbmRFdmVudCk6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1Jy0nLCBUcnVlLCBpbmRlbnRpb249VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19zZXF1ZW5jZV9pdGVtKQorICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShzZXF1ZW5jZT1UcnVlKQorCisgICAgIyBCbG9jayBtYXBwaW5nIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PUZhbHNlKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5leHBlY3RfZmlyc3RfYmxvY2tfbWFwcGluZ19rZXkKKworICAgIGRlZiBleHBlY3RfZmlyc3RfYmxvY2tfbWFwcGluZ19rZXkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX2tleShmaXJzdD1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nX2tleShzZWxmLCBmaXJzdD1GYWxzZSk6CisgICAgICAgIGlmIG5vdCBmaXJzdCBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBNYXBwaW5nRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja19zaW1wbGVfa2V5KCk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Jsb2NrX21hcHBpbmdfc2ltcGxlX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlLCBzaW1wbGVfa2V5PVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnPycsIFRydWUsIGluZGVudGlvbj1UcnVlKQorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nX3NpbXBsZV92YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSc6JywgRmFsc2UpCisgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX2tleSkKKyAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICBkZWYgZXhwZWN0X2Jsb2NrX21hcHBpbmdfdmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSc6JywgVHJ1ZSwgaW5kZW50aW9uPVRydWUpCisgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX2tleSkKKyAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICAjIENoZWNrZXJzLgorCisgICAgZGVmIGNoZWNrX2VtcHR5X3NlcXVlbmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2VxdWVuY2VTdGFydEV2ZW50KSBhbmQgc2VsZi5ldmVudHMKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50c1swXSwgU2VxdWVuY2VFbmRFdmVudCkpCisKKyAgICBkZWYgY2hlY2tfZW1wdHlfbWFwcGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChpc2luc3RhbmNlKHNlbGYuZXZlbnQsIE1hcHBpbmdTdGFydEV2ZW50KSBhbmQgc2VsZi5ldmVudHMKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50c1swXSwgTWFwcGluZ0VuZEV2ZW50KSkKKworICAgIGRlZiBjaGVja19lbXB0eV9kb2N1bWVudChzZWxmKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRTdGFydEV2ZW50KSBvciBub3Qgc2VsZi5ldmVudHM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXZlbnQgPSBzZWxmLmV2ZW50c1swXQorICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2UoZXZlbnQsIFNjYWxhckV2ZW50KSBhbmQgZXZlbnQuYW5jaG9yIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZXZlbnQudGFnIGlzIE5vbmUgYW5kIGV2ZW50LmltcGxpY2l0IGFuZCBldmVudC52YWx1ZSA9PSB1JycpCisKKyAgICBkZWYgY2hlY2tfc2ltcGxlX2tleShzZWxmKToKKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIE5vZGVFdmVudCkgYW5kIHNlbGYuZXZlbnQuYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF9hbmNob3IgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVkX2FuY2hvciA9IHNlbGYucHJlcGFyZV9hbmNob3Ioc2VsZi5ldmVudC5hbmNob3IpCisgICAgICAgICAgICBsZW5ndGggKz0gbGVuKHNlbGYucHJlcGFyZWRfYW5jaG9yKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIChTY2FsYXJFdmVudCwgQ29sbGVjdGlvblN0YXJ0RXZlbnQpKSAgXAorICAgICAgICAgICAgICAgIGFuZCBzZWxmLmV2ZW50LnRhZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYucHJlcGFyZWRfdGFnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wcmVwYXJlZF90YWcgPSBzZWxmLnByZXBhcmVfdGFnKHNlbGYuZXZlbnQudGFnKQorICAgICAgICAgICAgbGVuZ3RoICs9IGxlbihzZWxmLnByZXBhcmVkX3RhZykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTY2FsYXJFdmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmFuYWx5c2lzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hbmFseXNpcyA9IHNlbGYuYW5hbHl6ZV9zY2FsYXIoc2VsZi5ldmVudC52YWx1ZSkKKyAgICAgICAgICAgIGxlbmd0aCArPSBsZW4oc2VsZi5hbmFseXNpcy5zY2FsYXIpCisgICAgICAgIHJldHVybiAobGVuZ3RoIDwgMTI4IGFuZCAoaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBBbGlhc0V2ZW50KQorICAgICAgICAgICAgb3IgKGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2NhbGFyRXZlbnQpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5hbmFseXNpcy5lbXB0eSBhbmQgbm90IHNlbGYuYW5hbHlzaXMubXVsdGlsaW5lKQorICAgICAgICAgICAgb3Igc2VsZi5jaGVja19lbXB0eV9zZXF1ZW5jZSgpIG9yIHNlbGYuY2hlY2tfZW1wdHlfbWFwcGluZygpKSkKKworICAgICMgQW5jaG9yLCBUYWcsIGFuZCBTY2FsYXIgcHJvY2Vzc29ycy4KKworICAgIGRlZiBwcm9jZXNzX2FuY2hvcihzZWxmLCBpbmRpY2F0b3IpOgorICAgICAgICBpZiBzZWxmLmV2ZW50LmFuY2hvciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmVwYXJlZF9hbmNob3IgPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF9hbmNob3IgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJlcGFyZWRfYW5jaG9yID0gc2VsZi5wcmVwYXJlX2FuY2hvcihzZWxmLmV2ZW50LmFuY2hvcikKKyAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF9hbmNob3I6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcihpbmRpY2F0b3Irc2VsZi5wcmVwYXJlZF9hbmNob3IsIFRydWUpCisgICAgICAgIHNlbGYucHJlcGFyZWRfYW5jaG9yID0gTm9uZQorCisgICAgZGVmIHByb2Nlc3NfdGFnKHNlbGYpOgorICAgICAgICB0YWcgPSBzZWxmLmV2ZW50LnRhZworICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNjYWxhckV2ZW50KToKKyAgICAgICAgICAgIGlmIHNlbGYuc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0eWxlID0gc2VsZi5jaG9vc2Vfc2NhbGFyX3N0eWxlKCkKKyAgICAgICAgICAgIGlmICgobm90IHNlbGYuY2Fub25pY2FsIG9yIHRhZyBpcyBOb25lKSBhbmQKKyAgICAgICAgICAgICAgICAoKHNlbGYuc3R5bGUgPT0gJycgYW5kIHNlbGYuZXZlbnQuaW1wbGljaXRbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICBvciAoc2VsZi5zdHlsZSAhPSAnJyBhbmQgc2VsZi5ldmVudC5pbXBsaWNpdFsxXSkpKToKKyAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVkX3RhZyA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuZXZlbnQuaW1wbGljaXRbMF0gYW5kIHRhZyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRhZyA9IHUnIScKKyAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVkX3RhZyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIChub3Qgc2VsZi5jYW5vbmljYWwgb3IgdGFnIGlzIE5vbmUpIGFuZCBzZWxmLmV2ZW50LmltcGxpY2l0OgorICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB0YWcgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigidGFnIGlzIG5vdCBzcGVjaWZpZWQiKQorICAgICAgICBpZiBzZWxmLnByZXBhcmVkX3RhZyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmVwYXJlZF90YWcgPSBzZWxmLnByZXBhcmVfdGFnKHRhZykKKyAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF90YWc6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcihzZWxmLnByZXBhcmVkX3RhZywgVHJ1ZSkKKyAgICAgICAgc2VsZi5wcmVwYXJlZF90YWcgPSBOb25lCisKKyAgICBkZWYgY2hvb3NlX3NjYWxhcl9zdHlsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hbmFseXNpcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hbmFseXNpcyA9IHNlbGYuYW5hbHl6ZV9zY2FsYXIoc2VsZi5ldmVudC52YWx1ZSkKKyAgICAgICAgaWYgc2VsZi5ldmVudC5zdHlsZSA9PSAnIicgb3Igc2VsZi5jYW5vbmljYWw6CisgICAgICAgICAgICByZXR1cm4gJyInCisgICAgICAgIGlmIG5vdCBzZWxmLmV2ZW50LnN0eWxlIGFuZCBzZWxmLmV2ZW50LmltcGxpY2l0WzBdOgorICAgICAgICAgICAgaWYgKG5vdCAoc2VsZi5zaW1wbGVfa2V5X2NvbnRleHQgYW5kCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmFuYWx5c2lzLmVtcHR5IG9yIHNlbGYuYW5hbHlzaXMubXVsdGlsaW5lKSkKKyAgICAgICAgICAgICAgICBhbmQgKHNlbGYuZmxvd19sZXZlbCBhbmQgc2VsZi5hbmFseXNpcy5hbGxvd19mbG93X3BsYWluCisgICAgICAgICAgICAgICAgICAgIG9yIChub3Qgc2VsZi5mbG93X2xldmVsIGFuZCBzZWxmLmFuYWx5c2lzLmFsbG93X2Jsb2NrX3BsYWluKSkpOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBpZiBzZWxmLmV2ZW50LnN0eWxlIGFuZCBzZWxmLmV2ZW50LnN0eWxlIGluICd8Pic6CisgICAgICAgICAgICBpZiAobm90IHNlbGYuZmxvd19sZXZlbCBhbmQgbm90IHNlbGYuc2ltcGxlX2tleV9jb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLmFuYWx5c2lzLmFsbG93X2Jsb2NrKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ldmVudC5zdHlsZQorICAgICAgICBpZiBub3Qgc2VsZi5ldmVudC5zdHlsZSBvciBzZWxmLmV2ZW50LnN0eWxlID09ICdcJyc6CisgICAgICAgICAgICBpZiAoc2VsZi5hbmFseXNpcy5hbGxvd19zaW5nbGVfcXVvdGVkIGFuZAorICAgICAgICAgICAgICAgICAgICBub3QgKHNlbGYuc2ltcGxlX2tleV9jb250ZXh0IGFuZCBzZWxmLmFuYWx5c2lzLm11bHRpbGluZSkpOgorICAgICAgICAgICAgICAgIHJldHVybiAnXCcnCisgICAgICAgIHJldHVybiAnIicKKworICAgIGRlZiBwcm9jZXNzX3NjYWxhcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hbmFseXNpcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hbmFseXNpcyA9IHNlbGYuYW5hbHl6ZV9zY2FsYXIoc2VsZi5ldmVudC52YWx1ZSkKKyAgICAgICAgaWYgc2VsZi5zdHlsZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5zdHlsZSA9IHNlbGYuY2hvb3NlX3NjYWxhcl9zdHlsZSgpCisgICAgICAgIHNwbGl0ID0gKG5vdCBzZWxmLnNpbXBsZV9rZXlfY29udGV4dCkKKyAgICAgICAgI2lmIHNlbGYuYW5hbHlzaXMubXVsdGlsaW5lIGFuZCBzcGxpdCAgICBcCisgICAgICAgICMgICAgICAgIGFuZCAobm90IHNlbGYuc3R5bGUgb3Igc2VsZi5zdHlsZSBpbiAnXCdcIicpOgorICAgICAgICAjICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgaWYgc2VsZi5zdHlsZSA9PSAnIic6CisgICAgICAgICAgICBzZWxmLndyaXRlX2RvdWJsZV9xdW90ZWQoc2VsZi5hbmFseXNpcy5zY2FsYXIsIHNwbGl0KQorICAgICAgICBlbGlmIHNlbGYuc3R5bGUgPT0gJ1wnJzoKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc2luZ2xlX3F1b3RlZChzZWxmLmFuYWx5c2lzLnNjYWxhciwgc3BsaXQpCisgICAgICAgIGVsaWYgc2VsZi5zdHlsZSA9PSAnPic6CisgICAgICAgICAgICBzZWxmLndyaXRlX2ZvbGRlZChzZWxmLmFuYWx5c2lzLnNjYWxhcikKKyAgICAgICAgZWxpZiBzZWxmLnN0eWxlID09ICd8JzoKKyAgICAgICAgICAgIHNlbGYud3JpdGVfbGl0ZXJhbChzZWxmLmFuYWx5c2lzLnNjYWxhcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfcGxhaW4oc2VsZi5hbmFseXNpcy5zY2FsYXIsIHNwbGl0KQorICAgICAgICBzZWxmLmFuYWx5c2lzID0gTm9uZQorICAgICAgICBzZWxmLnN0eWxlID0gTm9uZQorCisgICAgIyBBbmFseXplcnMuCisKKyAgICBkZWYgcHJlcGFyZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBtYWpvciwgbWlub3IgPSB2ZXJzaW9uCisgICAgICAgIGlmIG1ham9yICE9IDE6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbjogJWQuJWQiICUgKG1ham9yLCBtaW5vcikpCisgICAgICAgIHJldHVybiB1JyVkLiVkJyAlIChtYWpvciwgbWlub3IpCisKKyAgICBkZWYgcHJlcGFyZV90YWdfaGFuZGxlKHNlbGYsIGhhbmRsZSk6CisgICAgICAgIGlmIG5vdCBoYW5kbGU6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoInRhZyBoYW5kbGUgbXVzdCBub3QgYmUgZW1wdHkiKQorICAgICAgICBpZiBoYW5kbGVbMF0gIT0gdSchJyBvciBoYW5kbGVbLTFdICE9IHUnISc6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoInRhZyBoYW5kbGUgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggJyEnOiAlciIKKyAgICAgICAgICAgICAgICAgICAgJSAoaGFuZGxlLmVuY29kZSgndXRmLTgnKSkpCisgICAgICAgIGZvciBjaCBpbiBoYW5kbGVbMTotMV06CisgICAgICAgICAgICBpZiBub3QgKHUnMCcgPD0gY2ggPD0gdSc5JyBvciB1J0EnIDw9IGNoIDw9IHUnWicgb3IgdSdhJyA8PSBjaCA8PSB1J3onICBcCisgICAgICAgICAgICAgICAgICAgIG9yIGNoIGluIHUnLV8nKToKKyAgICAgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoImludmFsaWQgY2hhcmFjdGVyICVyIGluIHRoZSB0YWcgaGFuZGxlOiAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGNoLmVuY29kZSgndXRmLTgnKSwgaGFuZGxlLmVuY29kZSgndXRmLTgnKSkpCisgICAgICAgIHJldHVybiBoYW5kbGUKKworICAgIGRlZiBwcmVwYXJlX3RhZ19wcmVmaXgoc2VsZiwgcHJlZml4KToKKyAgICAgICAgaWYgbm90IHByZWZpeDoKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigidGFnIHByZWZpeCBtdXN0IG5vdCBiZSBlbXB0eSIpCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0ID0gZW5kID0gMAorICAgICAgICBpZiBwcmVmaXhbMF0gPT0gdSchJzoKKyAgICAgICAgICAgIGVuZCA9IDEKKyAgICAgICAgd2hpbGUgZW5kIDwgbGVuKHByZWZpeCk6CisgICAgICAgICAgICBjaCA9IHByZWZpeFtlbmRdCisgICAgICAgICAgICBpZiB1JzAnIDw9IGNoIDw9IHUnOScgb3IgdSdBJyA8PSBjaCA8PSB1J1onIG9yIHUnYScgPD0gY2ggPD0gdSd6JyAgIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gdSctOy8/ITpAJj0rJCxfLn4qXCcoKVtdJzoKKyAgICAgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzdGFydCA8IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChwcmVmaXhbc3RhcnQ6ZW5kXSkKKyAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCA9IGVuZCsxCisgICAgICAgICAgICAgICAgZGF0YSA9IGNoLmVuY29kZSgndXRmLTgnKQorICAgICAgICAgICAgICAgIGZvciBjaCBpbiBkYXRhOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHUnJSUlMDJYJyAlIG9yZChjaCkpCisgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChwcmVmaXhbc3RhcnQ6ZW5kXSkKKyAgICAgICAgcmV0dXJuIHUnJy5qb2luKGNodW5rcykKKworICAgIGRlZiBwcmVwYXJlX3RhZyhzZWxmLCB0YWcpOgorICAgICAgICBpZiBub3QgdGFnOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJ0YWcgbXVzdCBub3QgYmUgZW1wdHkiKQorICAgICAgICBpZiB0YWcgPT0gdSchJzoKKyAgICAgICAgICAgIHJldHVybiB0YWcKKyAgICAgICAgaGFuZGxlID0gTm9uZQorICAgICAgICBzdWZmaXggPSB0YWcKKyAgICAgICAgcHJlZml4ZXMgPSBzZWxmLnRhZ19wcmVmaXhlcy5rZXlzKCkKKyAgICAgICAgcHJlZml4ZXMuc29ydCgpCisgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CisgICAgICAgICAgICBpZiB0YWcuc3RhcnRzd2l0aChwcmVmaXgpICAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgKHByZWZpeCA9PSB1JyEnIG9yIGxlbihwcmVmaXgpIDwgbGVuKHRhZykpOgorICAgICAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYudGFnX3ByZWZpeGVzW3ByZWZpeF0KKyAgICAgICAgICAgICAgICBzdWZmaXggPSB0YWdbbGVuKHByZWZpeCk6XQorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDwgbGVuKHN1ZmZpeCk6CisgICAgICAgICAgICBjaCA9IHN1ZmZpeFtlbmRdCisgICAgICAgICAgICBpZiB1JzAnIDw9IGNoIDw9IHUnOScgb3IgdSdBJyA8PSBjaCA8PSB1J1onIG9yIHUnYScgPD0gY2ggPD0gdSd6JyAgIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gdSctOy8/OkAmPSskLF8ufipcJygpW10nICAgXAorICAgICAgICAgICAgICAgICAgICBvciAoY2ggPT0gdSchJyBhbmQgaGFuZGxlICE9IHUnIScpOgorICAgICAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHN1ZmZpeFtzdGFydDplbmRdKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kID0gZW5kKzEKKyAgICAgICAgICAgICAgICBkYXRhID0gY2guZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgICAgZm9yIGNoIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQodSclJSUwMlgnICUgb3JkKGNoKSkKKyAgICAgICAgaWYgc3RhcnQgPCBlbmQ6CisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHN1ZmZpeFtzdGFydDplbmRdKQorICAgICAgICBzdWZmaXhfdGV4dCA9IHUnJy5qb2luKGNodW5rcykKKyAgICAgICAgaWYgaGFuZGxlOgorICAgICAgICAgICAgcmV0dXJuIHUnJXMlcycgJSAoaGFuZGxlLCBzdWZmaXhfdGV4dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB1JyE8JXM+JyAlIHN1ZmZpeF90ZXh0CisKKyAgICBkZWYgcHJlcGFyZV9hbmNob3Ioc2VsZiwgYW5jaG9yKToKKyAgICAgICAgaWYgbm90IGFuY2hvcjoKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiYW5jaG9yIG11c3Qgbm90IGJlIGVtcHR5IikKKyAgICAgICAgZm9yIGNoIGluIGFuY2hvcjoKKyAgICAgICAgICAgIGlmIG5vdCAodScwJyA8PSBjaCA8PSB1JzknIG9yIHUnQScgPD0gY2ggPD0gdSdaJyBvciB1J2EnIDw9IGNoIDw9IHUneicgIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gdSctXycpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIgJXIgaW4gdGhlIGFuY2hvcjogJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIChjaC5lbmNvZGUoJ3V0Zi04JyksIGFuY2hvci5lbmNvZGUoJ3V0Zi04JykpKQorICAgICAgICByZXR1cm4gYW5jaG9yCisKKyAgICBkZWYgYW5hbHl6ZV9zY2FsYXIoc2VsZiwgc2NhbGFyKToKKworICAgICAgICAjIEVtcHR5IHNjYWxhciBpcyBhIHNwZWNpYWwgY2FzZS4KKyAgICAgICAgaWYgbm90IHNjYWxhcjoKKyAgICAgICAgICAgIHJldHVybiBTY2FsYXJBbmFseXNpcyhzY2FsYXI9c2NhbGFyLCBlbXB0eT1UcnVlLCBtdWx0aWxpbmU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW49RmFsc2UsIGFsbG93X2Jsb2NrX3BsYWluPVRydWUsCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3NpbmdsZV9xdW90ZWQ9VHJ1ZSwgYWxsb3dfZG91YmxlX3F1b3RlZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICBhbGxvd19ibG9jaz1GYWxzZSkKKworICAgICAgICAjIEluZGljYXRvcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IEZhbHNlCisgICAgICAgIGZsb3dfaW5kaWNhdG9ycyA9IEZhbHNlCisgICAgICAgIGxpbmVfYnJlYWtzID0gRmFsc2UKKyAgICAgICAgc3BlY2lhbF9jaGFyYWN0ZXJzID0gRmFsc2UKKworICAgICAgICAjIEltcG9ydGFudCB3aGl0ZXNwYWNlIGNvbWJpbmF0aW9ucy4KKyAgICAgICAgbGVhZGluZ19zcGFjZSA9IEZhbHNlCisgICAgICAgIGxlYWRpbmdfYnJlYWsgPSBGYWxzZQorICAgICAgICB0cmFpbGluZ19zcGFjZSA9IEZhbHNlCisgICAgICAgIHRyYWlsaW5nX2JyZWFrID0gRmFsc2UKKyAgICAgICAgYnJlYWtfc3BhY2UgPSBGYWxzZQorICAgICAgICBzcGFjZV9icmVhayA9IEZhbHNlCisKKyAgICAgICAgIyBDaGVjayBkb2N1bWVudCBpbmRpY2F0b3JzLgorICAgICAgICBpZiBzY2FsYXIuc3RhcnRzd2l0aCh1Jy0tLScpIG9yIHNjYWxhci5zdGFydHN3aXRoKHUnLi4uJyk6CisgICAgICAgICAgICBibG9ja19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgZmxvd19pbmRpY2F0b3JzID0gVHJ1ZQorCisgICAgICAgICMgRmlyc3QgY2hhcmFjdGVyIG9yIHByZWNlZGVkIGJ5IGEgd2hpdGVzcGFjZS4KKyAgICAgICAgcHJlY2VlZGVkX2J5X3doaXRlc3BhY2UgPSBUcnVlCisKKyAgICAgICAgIyBMYXN0IGNoYXJhY3RlciBvciBmb2xsb3dlZCBieSBhIHdoaXRlc3BhY2UuCisgICAgICAgIGZvbGxvd2VkX2J5X3doaXRlc3BhY2UgPSAobGVuKHNjYWxhcikgPT0gMSBvcgorICAgICAgICAgICAgICAgIHNjYWxhclsxXSBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknKQorCisgICAgICAgICMgVGhlIHByZXZpb3VzIGNoYXJhY3RlciBpcyBhIHNwYWNlLgorICAgICAgICBwcmV2aW91c19zcGFjZSA9IEZhbHNlCisKKyAgICAgICAgIyBUaGUgcHJldmlvdXMgY2hhcmFjdGVyIGlzIGEgYnJlYWsuCisgICAgICAgIHByZXZpb3VzX2JyZWFrID0gRmFsc2UKKworICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgd2hpbGUgaW5kZXggPCBsZW4oc2NhbGFyKToKKyAgICAgICAgICAgIGNoID0gc2NhbGFyW2luZGV4XQorCisgICAgICAgICAgICAjIENoZWNrIGZvciBpbmRpY2F0b3JzLgorICAgICAgICAgICAgaWYgaW5kZXggPT0gMDoKKyAgICAgICAgICAgICAgICAjIExlYWRpbmcgaW5kaWNhdG9ycyBhcmUgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIGlmIGNoIGluIHUnIyxbXXt9JiohfD5cJ1wiJUBgJzogCisgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjaCBpbiB1Jz86JzoKKyAgICAgICAgICAgICAgICAgICAgZmxvd19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBmb2xsb3dlZF9ieV93aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjaCA9PSB1Jy0nIGFuZCBmb2xsb3dlZF9ieV93aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJsb2NrX2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgU29tZSBpbmRpY2F0b3JzIGNhbm5vdCBhcHBlYXIgd2l0aGluIGEgc2NhbGFyIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgaWYgY2ggaW4gdScsP1tde30nOgorICAgICAgICAgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgY2ggPT0gdSc6JzoKKyAgICAgICAgICAgICAgICAgICAgZmxvd19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBmb2xsb3dlZF9ieV93aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjaCA9PSB1JyMnIGFuZCBwcmVjZWVkZWRfYnlfd2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZmxvd19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBibG9ja19pbmRpY2F0b3JzID0gVHJ1ZQorCisgICAgICAgICAgICAjIENoZWNrIGZvciBsaW5lIGJyZWFrcywgc3BlY2lhbCwgYW5kIHVuaWNvZGUgY2hhcmFjdGVycy4KKyAgICAgICAgICAgIGlmIGNoIGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBsaW5lX2JyZWFrcyA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCAoY2ggPT0gdSdcbicgb3IgdSdceDIwJyA8PSBjaCA8PSB1J1x4N0UnKToKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gdSdceDg1JyBvciB1J1x4QTAnIDw9IGNoIDw9IHUnXHVEN0ZGJworICAgICAgICAgICAgICAgICAgICAgICAgb3IgdSdcdUUwMDAnIDw9IGNoIDw9IHUnXHVGRkZEJykgYW5kIGNoICE9IHUnXHVGRUZGJzoKKyAgICAgICAgICAgICAgICAgICAgdW5pY29kZV9jaGFyYWN0ZXJzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd191bmljb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbF9jaGFyYWN0ZXJzID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfY2hhcmFjdGVycyA9IFRydWUKKworICAgICAgICAgICAgIyBEZXRlY3QgaW1wb3J0YW50IHdoaXRlc3BhY2UgY29tYmluYXRpb25zLgorICAgICAgICAgICAgaWYgY2ggPT0gdScgJzoKKyAgICAgICAgICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX3NwYWNlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IGxlbihzY2FsYXIpLTE6CisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX3NwYWNlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzX2JyZWFrOgorICAgICAgICAgICAgICAgICAgICBicmVha19zcGFjZSA9IFRydWUKKyAgICAgICAgICAgICAgICBwcmV2aW91c19zcGFjZSA9IFRydWUKKyAgICAgICAgICAgICAgICBwcmV2aW91c19icmVhayA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIGNoIGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX2JyZWFrID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IGxlbihzY2FsYXIpLTE6CisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2JyZWFrID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzX3NwYWNlOgorICAgICAgICAgICAgICAgICAgICBzcGFjZV9icmVhayA9IFRydWUKKyAgICAgICAgICAgICAgICBwcmV2aW91c19zcGFjZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJldmlvdXNfYnJlYWsgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZXZpb3VzX3NwYWNlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBwcmV2aW91c19icmVhayA9IEZhbHNlCisKKyAgICAgICAgICAgICMgUHJlcGFyZSBmb3IgdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgcHJlY2VlZGVkX2J5X3doaXRlc3BhY2UgPSAoY2ggaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JykKKyAgICAgICAgICAgIGZvbGxvd2VkX2J5X3doaXRlc3BhY2UgPSAoaW5kZXgrMSA+PSBsZW4oc2NhbGFyKSBvcgorICAgICAgICAgICAgICAgICAgICBzY2FsYXJbaW5kZXgrMV0gaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JykKKworICAgICAgICAjIExldCdzIGRlY2lkZSB3aGF0IHN0eWxlcyBhcmUgYWxsb3dlZC4KKyAgICAgICAgYWxsb3dfZmxvd19wbGFpbiA9IFRydWUKKyAgICAgICAgYWxsb3dfYmxvY2tfcGxhaW4gPSBUcnVlCisgICAgICAgIGFsbG93X3NpbmdsZV9xdW90ZWQgPSBUcnVlCisgICAgICAgIGFsbG93X2RvdWJsZV9xdW90ZWQgPSBUcnVlCisgICAgICAgIGFsbG93X2Jsb2NrID0gVHJ1ZQorCisgICAgICAgICMgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYXJlIGJhZCBmb3IgcGxhaW4gc2NhbGFycy4KKyAgICAgICAgaWYgKGxlYWRpbmdfc3BhY2Ugb3IgbGVhZGluZ19icmVhaworICAgICAgICAgICAgICAgIG9yIHRyYWlsaW5nX3NwYWNlIG9yIHRyYWlsaW5nX2JyZWFrKToKKyAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW4gPSBhbGxvd19ibG9ja19wbGFpbiA9IEZhbHNlCisKKyAgICAgICAgIyBXZSBkbyBub3QgcGVybWl0IHRyYWlsaW5nIHNwYWNlcyBmb3IgYmxvY2sgc2NhbGFycy4KKyAgICAgICAgaWYgdHJhaWxpbmdfc3BhY2U6CisgICAgICAgICAgICBhbGxvd19ibG9jayA9IEZhbHNlCisKKyAgICAgICAgIyBTcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBsaW5lIGFyZSBvbmx5IGFjY2VwdGFibGUgZm9yIGJsb2NrCisgICAgICAgICMgc2NhbGFycy4KKyAgICAgICAgaWYgYnJlYWtfc3BhY2U6CisgICAgICAgICAgICBhbGxvd19mbG93X3BsYWluID0gYWxsb3dfYmxvY2tfcGxhaW4gPSBhbGxvd19zaW5nbGVfcXVvdGVkID0gRmFsc2UKKworICAgICAgICAjIFNwYWNlcyBmb2xsb3dlZCBieSBicmVha3MsIGFzIHdlbGwgYXMgc3BlY2lhbCBjaGFyYWN0ZXIgYXJlIG9ubHkKKyAgICAgICAgIyBhbGxvd2VkIGZvciBkb3VibGUgcXVvdGVkIHNjYWxhcnMuCisgICAgICAgIGlmIHNwYWNlX2JyZWFrIG9yIHNwZWNpYWxfY2hhcmFjdGVyczoKKyAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW4gPSBhbGxvd19ibG9ja19wbGFpbiA9ICBcCisgICAgICAgICAgICBhbGxvd19zaW5nbGVfcXVvdGVkID0gYWxsb3dfYmxvY2sgPSBGYWxzZQorCisgICAgICAgICMgQWx0aG91Z2ggdGhlIHBsYWluIHNjYWxhciB3cml0ZXIgc3VwcG9ydHMgYnJlYWtzLCB3ZSBuZXZlciBlbWl0CisgICAgICAgICMgbXVsdGlsaW5lIHBsYWluIHNjYWxhcnMuCisgICAgICAgIGlmIGxpbmVfYnJlYWtzOgorICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbiA9IGFsbG93X2Jsb2NrX3BsYWluID0gRmFsc2UKKworICAgICAgICAjIEZsb3cgaW5kaWNhdG9ycyBhcmUgZm9yYmlkZGVuIGZvciBmbG93IHBsYWluIHNjYWxhcnMuCisgICAgICAgIGlmIGZsb3dfaW5kaWNhdG9yczoKKyAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW4gPSBGYWxzZQorCisgICAgICAgICMgQmxvY2sgaW5kaWNhdG9ycyBhcmUgZm9yYmlkZGVuIGZvciBibG9jayBwbGFpbiBzY2FsYXJzLgorICAgICAgICBpZiBibG9ja19pbmRpY2F0b3JzOgorICAgICAgICAgICAgYWxsb3dfYmxvY2tfcGxhaW4gPSBGYWxzZQorCisgICAgICAgIHJldHVybiBTY2FsYXJBbmFseXNpcyhzY2FsYXI9c2NhbGFyLAorICAgICAgICAgICAgICAgIGVtcHR5PUZhbHNlLCBtdWx0aWxpbmU9bGluZV9icmVha3MsCisgICAgICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbj1hbGxvd19mbG93X3BsYWluLAorICAgICAgICAgICAgICAgIGFsbG93X2Jsb2NrX3BsYWluPWFsbG93X2Jsb2NrX3BsYWluLAorICAgICAgICAgICAgICAgIGFsbG93X3NpbmdsZV9xdW90ZWQ9YWxsb3dfc2luZ2xlX3F1b3RlZCwKKyAgICAgICAgICAgICAgICBhbGxvd19kb3VibGVfcXVvdGVkPWFsbG93X2RvdWJsZV9xdW90ZWQsCisgICAgICAgICAgICAgICAgYWxsb3dfYmxvY2s9YWxsb3dfYmxvY2spCisKKyAgICAjIFdyaXRlcnMuCisKKyAgICBkZWYgZmx1c2hfc3RyZWFtKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuc3RyZWFtLCAnZmx1c2gnKToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiB3cml0ZV9zdHJlYW1fc3RhcnQoc2VsZik6CisgICAgICAgICMgV3JpdGUgQk9NIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZyBhbmQgc2VsZi5lbmNvZGluZy5zdGFydHN3aXRoKCd1dGYtMTYnKToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKHUnXHVGRUZGJy5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisKKyAgICBkZWYgd3JpdGVfc3RyZWFtX2VuZChzZWxmKToKKyAgICAgICAgc2VsZi5mbHVzaF9zdHJlYW0oKQorCisgICAgZGVmIHdyaXRlX2luZGljYXRvcihzZWxmLCBpbmRpY2F0b3IsIG5lZWRfd2hpdGVzcGFjZSwKKyAgICAgICAgICAgIHdoaXRlc3BhY2U9RmFsc2UsIGluZGVudGlvbj1GYWxzZSk6CisgICAgICAgIGlmIHNlbGYud2hpdGVzcGFjZSBvciBub3QgbmVlZF93aGl0ZXNwYWNlOgorICAgICAgICAgICAgZGF0YSA9IGluZGljYXRvcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IHUnICcraW5kaWNhdG9yCisgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IHdoaXRlc3BhY2UKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBzZWxmLmluZGVudGlvbiBhbmQgaW5kZW50aW9uCisgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICBzZWxmLm9wZW5fZW5kZWQgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICBkZWYgd3JpdGVfaW5kZW50KHNlbGYpOgorICAgICAgICBpbmRlbnQgPSBzZWxmLmluZGVudCBvciAwCisgICAgICAgIGlmIG5vdCBzZWxmLmluZGVudGlvbiBvciBzZWxmLmNvbHVtbiA+IGluZGVudCAgIFwKKyAgICAgICAgICAgICAgICBvciAoc2VsZi5jb2x1bW4gPT0gaW5kZW50IGFuZCBub3Qgc2VsZi53aGl0ZXNwYWNlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgIGlmIHNlbGYuY29sdW1uIDwgaW5kZW50OgorICAgICAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gVHJ1ZQorICAgICAgICAgICAgZGF0YSA9IHUnICcqKGluZGVudC1zZWxmLmNvbHVtbikKKyAgICAgICAgICAgIHNlbGYuY29sdW1uID0gaW5kZW50CisgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKworICAgIGRlZiB3cml0ZV9saW5lX2JyZWFrKHNlbGYsIGRhdGE9Tm9uZSk6CisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLmJlc3RfbGluZV9icmVhaworICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSBUcnVlCisgICAgICAgIHNlbGYuaW5kZW50aW9uID0gVHJ1ZQorICAgICAgICBzZWxmLmxpbmUgKz0gMQorICAgICAgICBzZWxmLmNvbHVtbiA9IDAKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorCisgICAgZGVmIHdyaXRlX3ZlcnNpb25fZGlyZWN0aXZlKHNlbGYsIHZlcnNpb25fdGV4dCk6CisgICAgICAgIGRhdGEgPSB1JyUlWUFNTCAlcycgJSB2ZXJzaW9uX3RleHQKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorCisgICAgZGVmIHdyaXRlX3RhZ19kaXJlY3RpdmUoc2VsZiwgaGFuZGxlX3RleHQsIHByZWZpeF90ZXh0KToKKyAgICAgICAgZGF0YSA9IHUnJSVUQUcgJXMgJXMnICUgKGhhbmRsZV90ZXh0LCBwcmVmaXhfdGV4dCkKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorCisgICAgIyBTY2FsYXIgc3RyZWFtcy4KKworICAgIGRlZiB3cml0ZV9zaW5nbGVfcXVvdGVkKHNlbGYsIHRleHQsIHNwbGl0PVRydWUpOgorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1J1wnJywgVHJ1ZSkKKyAgICAgICAgc3BhY2VzID0gRmFsc2UKKyAgICAgICAgYnJlYWtzID0gRmFsc2UKKyAgICAgICAgc3RhcnQgPSBlbmQgPSAwCisgICAgICAgIHdoaWxlIGVuZCA8PSBsZW4odGV4dCk6CisgICAgICAgICAgICBjaCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGVuZCA8IGxlbih0ZXh0KToKKyAgICAgICAgICAgICAgICBjaCA9IHRleHRbZW5kXQorICAgICAgICAgICAgaWYgc3BhY2VzOgorICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmUgb3IgY2ggIT0gdScgJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQrMSA9PSBlbmQgYW5kIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoIGFuZCBzcGxpdCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3RhcnQgIT0gMCBhbmQgZW5kICE9IGxlbih0ZXh0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbGlmIGJyZWFrczoKKyAgICAgICAgICAgICAgICBpZiBjaCBpcyBOb25lIG9yIGNoIG5vdCBpbiB1J1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHRleHRbc3RhcnRdID09IHUnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJyIGluIHRleHRbc3RhcnQ6ZW5kXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJyID09IHUnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhayhicikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBjaCBpcyBOb25lIG9yIGNoIGluIHUnIFxuXHg4NVx1MjAyOFx1MjAyOScgb3IgY2ggPT0gdSdcJyc6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRleHRbc3RhcnQ6ZW5kXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBpZiBjaCA9PSB1J1wnJzoKKyAgICAgICAgICAgICAgICBkYXRhID0gdSdcJ1wnJworICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IDIKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMQorICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3BhY2VzID0gKGNoID09IHUnICcpCisgICAgICAgICAgICAgICAgYnJlYWtzID0gKGNoIGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JykKKyAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnXCcnLCBGYWxzZSkKKworICAgIEVTQ0FQRV9SRVBMQUNFTUVOVFMgPSB7CisgICAgICAgIHUnXDAnOiAgICAgIHUnMCcsCisgICAgICAgIHUnXHgwNyc6ICAgIHUnYScsCisgICAgICAgIHUnXHgwOCc6ICAgIHUnYicsCisgICAgICAgIHUnXHgwOSc6ICAgIHUndCcsCisgICAgICAgIHUnXHgwQSc6ICAgIHUnbicsCisgICAgICAgIHUnXHgwQic6ICAgIHUndicsCisgICAgICAgIHUnXHgwQyc6ICAgIHUnZicsCisgICAgICAgIHUnXHgwRCc6ICAgIHUncicsCisgICAgICAgIHUnXHgxQic6ICAgIHUnZScsCisgICAgICAgIHUnXCInOiAgICAgIHUnXCInLAorICAgICAgICB1J1xcJzogICAgICB1J1xcJywKKyAgICAgICAgdSdceDg1JzogICAgdSdOJywKKyAgICAgICAgdSdceEEwJzogICAgdSdfJywKKyAgICAgICAgdSdcdTIwMjgnOiAgdSdMJywKKyAgICAgICAgdSdcdTIwMjknOiAgdSdQJywKKyAgICB9CisKKyAgICBkZWYgd3JpdGVfZG91YmxlX3F1b3RlZChzZWxmLCB0ZXh0LCBzcGxpdD1UcnVlKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IodSciJywgVHJ1ZSkKKyAgICAgICAgc3RhcnQgPSBlbmQgPSAwCisgICAgICAgIHdoaWxlIGVuZCA8PSBsZW4odGV4dCk6CisgICAgICAgICAgICBjaCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGVuZCA8IGxlbih0ZXh0KToKKyAgICAgICAgICAgICAgICBjaCA9IHRleHRbZW5kXQorICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBpbiB1JyJcXFx4ODVcdTIwMjhcdTIwMjlcdUZFRkYnIFwKKyAgICAgICAgICAgICAgICAgICAgb3Igbm90ICh1J1x4MjAnIDw9IGNoIDw9IHUnXHg3RScKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIChzZWxmLmFsbG93X3VuaWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKHUnXHhBMCcgPD0gY2ggPD0gdSdcdUQ3RkYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHUnXHVFMDAwJyA8PSBjaCA8PSB1J1x1RkZGRCcpKSk6CisgICAgICAgICAgICAgICAgaWYgc3RhcnQgPCBlbmQ6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgICAgICBpZiBjaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggaW4gc2VsZi5FU0NBUEVfUkVQTEFDRU1FTlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHUnXFwnK3NlbGYuRVNDQVBFX1JFUExBQ0VNRU5UU1tjaF0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjaCA8PSB1J1x4RkYnOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHUnXFx4JTAyWCcgJSBvcmQoY2gpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgY2ggPD0gdSdcdUZGRkYnOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHUnXFx1JTA0WCcgJSBvcmQoY2gpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdSdcXFUlMDhYJyAlIG9yZChjaCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQrMQorICAgICAgICAgICAgaWYgMCA8IGVuZCA8IGxlbih0ZXh0KS0xIGFuZCAoY2ggPT0gdScgJyBvciBzdGFydCA+PSBlbmQpICAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5jb2x1bW4rKGVuZC1zdGFydCkgPiBzZWxmLmJlc3Rfd2lkdGggYW5kIHNwbGl0OgorICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0rdSdcXCcKKyAgICAgICAgICAgICAgICBpZiBzdGFydCA8IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50aW9uID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiB0ZXh0W3N0YXJ0XSA9PSB1JyAnOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdSdcXCcKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnIicsIEZhbHNlKQorCisgICAgZGVmIGRldGVybWluZV9ibG9ja19oaW50cyhzZWxmLCB0ZXh0KToKKyAgICAgICAgaGludHMgPSB1JycKKyAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgIGlmIHRleHRbMF0gaW4gdScgXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBoaW50cyArPSB1bmljb2RlKHNlbGYuYmVzdF9pbmRlbnQpCisgICAgICAgICAgICBpZiB0ZXh0Wy0xXSBub3QgaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGhpbnRzICs9IHUnLScKKyAgICAgICAgICAgIGVsaWYgbGVuKHRleHQpID09IDEgb3IgdGV4dFstMl0gaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGhpbnRzICs9IHUnKycKKyAgICAgICAgcmV0dXJuIGhpbnRzCisKKyAgICBkZWYgd3JpdGVfZm9sZGVkKHNlbGYsIHRleHQpOgorICAgICAgICBoaW50cyA9IHNlbGYuZGV0ZXJtaW5lX2Jsb2NrX2hpbnRzKHRleHQpCisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKHUnPicraGludHMsIFRydWUpCisgICAgICAgIGlmIGhpbnRzWy0xOl0gPT0gdScrJzoKKyAgICAgICAgICAgIHNlbGYub3Blbl9lbmRlZCA9IFRydWUKKyAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgbGVhZGluZ19zcGFjZSA9IFRydWUKKyAgICAgICAgc3BhY2VzID0gRmFsc2UKKyAgICAgICAgYnJlYWtzID0gVHJ1ZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBicmVha3M6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBub3QgaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGVhZGluZ19zcGFjZSBhbmQgY2ggaXMgbm90IE5vbmUgYW5kIGNoICE9IHUnICcgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGV4dFtzdGFydF0gPT0gdSdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBsZWFkaW5nX3NwYWNlID0gKGNoID09IHUnICcpCisgICAgICAgICAgICAgICAgICAgIGZvciBiciBpbiB0ZXh0W3N0YXJ0OmVuZF06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiciA9PSB1J1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoYnIpCisgICAgICAgICAgICAgICAgICAgIGlmIGNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgZWxpZiBzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgY2ggIT0gdScgJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQrMSA9PSBlbmQgYW5kIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRleHRbc3RhcnQ6ZW5kXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBpbiB1JyBcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWtzID0gKGNoIGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JykKKyAgICAgICAgICAgICAgICBzcGFjZXMgPSAoY2ggPT0gdScgJykKKyAgICAgICAgICAgIGVuZCArPSAxCisKKyAgICBkZWYgd3JpdGVfbGl0ZXJhbChzZWxmLCB0ZXh0KToKKyAgICAgICAgaGludHMgPSBzZWxmLmRldGVybWluZV9ibG9ja19oaW50cyh0ZXh0KQorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcih1J3wnK2hpbnRzLCBUcnVlKQorICAgICAgICBpZiBoaW50c1stMTpdID09IHUnKyc6CisgICAgICAgICAgICBzZWxmLm9wZW5fZW5kZWQgPSBUcnVlCisgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgIGJyZWFrcyA9IFRydWUKKyAgICAgICAgc3RhcnQgPSBlbmQgPSAwCisgICAgICAgIHdoaWxlIGVuZCA8PSBsZW4odGV4dCk6CisgICAgICAgICAgICBjaCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGVuZCA8IGxlbih0ZXh0KToKKyAgICAgICAgICAgICAgICBjaCA9IHRleHRbZW5kXQorICAgICAgICAgICAgaWYgYnJlYWtzOgorICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmUgb3IgY2ggbm90IGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJyIGluIHRleHRbc3RhcnQ6ZW5kXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJyID09IHUnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhayhicikKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmUgb3IgY2ggaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBpZiBjaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBicmVha3MgPSAoY2ggaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknKQorICAgICAgICAgICAgZW5kICs9IDEKKworICAgIGRlZiB3cml0ZV9wbGFpbihzZWxmLCB0ZXh0LCBzcGxpdD1UcnVlKToKKyAgICAgICAgaWYgc2VsZi5yb290X2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLm9wZW5fZW5kZWQgPSBUcnVlCisgICAgICAgIGlmIG5vdCB0ZXh0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzZWxmLndoaXRlc3BhY2U6CisgICAgICAgICAgICBkYXRhID0gdScgJworICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBGYWxzZQorICAgICAgICBzcGFjZXMgPSBGYWxzZQorICAgICAgICBicmVha3MgPSBGYWxzZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgY2ggIT0gdScgJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQrMSA9PSBlbmQgYW5kIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoIGFuZCBzcGxpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGVudGlvbiA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgZWxpZiBicmVha3M6CisgICAgICAgICAgICAgICAgaWYgY2ggbm90IGluIHUnXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgdGV4dFtzdGFydF0gPT0gdSdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBmb3IgYnIgaW4gdGV4dFtzdGFydDplbmRdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnIgPT0gdSdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKGJyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50aW9uID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBpbiB1JyBcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBpZiBjaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzcGFjZXMgPSAoY2ggPT0gdScgJykKKyAgICAgICAgICAgICAgICBicmVha3MgPSAoY2ggaW4gdSdcblx4ODVcdTIwMjhcdTIwMjknKQorICAgICAgICAgICAgZW5kICs9IDEKKwpkaWZmIC0tZ2l0IGEvbGliL3lhbWwvZXJyb3IucHkgYi9saWIveWFtbC9lcnJvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc2ODZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvZXJyb3IucHkKQEAgLTAsMCArMSw3NSBAQAorCitfX2FsbF9fID0gWydNYXJrJywgJ1lBTUxFcnJvcicsICdNYXJrZWRZQU1MRXJyb3InXQorCitjbGFzcyBNYXJrKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaW5kZXgsIGxpbmUsIGNvbHVtbiwgYnVmZmVyLCBwb2ludGVyKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorICAgICAgICBzZWxmLmNvbHVtbiA9IGNvbHVtbgorICAgICAgICBzZWxmLmJ1ZmZlciA9IGJ1ZmZlcgorICAgICAgICBzZWxmLnBvaW50ZXIgPSBwb2ludGVyCisKKyAgICBkZWYgZ2V0X3NuaXBwZXQoc2VsZiwgaW5kZW50PTQsIG1heF9sZW5ndGg9NzUpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaGVhZCA9ICcnCisgICAgICAgIHN0YXJ0ID0gc2VsZi5wb2ludGVyCisgICAgICAgIHdoaWxlIHN0YXJ0ID4gMCBhbmQgc2VsZi5idWZmZXJbc3RhcnQtMV0gbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBzdGFydCAtPSAxCisgICAgICAgICAgICBpZiBzZWxmLnBvaW50ZXItc3RhcnQgPiBtYXhfbGVuZ3RoLzItMToKKyAgICAgICAgICAgICAgICBoZWFkID0gJyAuLi4gJworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICB0YWlsID0gJycKKyAgICAgICAgZW5kID0gc2VsZi5wb2ludGVyCisgICAgICAgIHdoaWxlIGVuZCA8IGxlbihzZWxmLmJ1ZmZlcikgYW5kIHNlbGYuYnVmZmVyW2VuZF0gbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICAgICAgaWYgZW5kLXNlbGYucG9pbnRlciA+IG1heF9sZW5ndGgvMi0xOgorICAgICAgICAgICAgICAgIHRhaWwgPSAnIC4uLiAnCisgICAgICAgICAgICAgICAgZW5kIC09IDUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzbmlwcGV0ID0gc2VsZi5idWZmZXJbc3RhcnQ6ZW5kXS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgcmV0dXJuICcgJyppbmRlbnQgKyBoZWFkICsgc25pcHBldCArIHRhaWwgKyAnXG4nICBcCisgICAgICAgICAgICAgICAgKyAnICcqKGluZGVudCtzZWxmLnBvaW50ZXItc3RhcnQrbGVuKGhlYWQpKSArICdeJworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHNuaXBwZXQgPSBzZWxmLmdldF9zbmlwcGV0KCkKKyAgICAgICAgd2hlcmUgPSAiICBpbiBcIiVzXCIsIGxpbmUgJWQsIGNvbHVtbiAlZCIgICBcCisgICAgICAgICAgICAgICAgJSAoc2VsZi5uYW1lLCBzZWxmLmxpbmUrMSwgc2VsZi5jb2x1bW4rMSkKKyAgICAgICAgaWYgc25pcHBldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdoZXJlICs9ICI6XG4iK3NuaXBwZXQKKyAgICAgICAgcmV0dXJuIHdoZXJlCisKK2NsYXNzIFlBTUxFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgTWFya2VkWUFNTEVycm9yKFlBTUxFcnJvcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGV4dD1Ob25lLCBjb250ZXh0X21hcms9Tm9uZSwKKyAgICAgICAgICAgIHByb2JsZW09Tm9uZSwgcHJvYmxlbV9tYXJrPU5vbmUsIG5vdGU9Tm9uZSk6CisgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKKyAgICAgICAgc2VsZi5jb250ZXh0X21hcmsgPSBjb250ZXh0X21hcmsKKyAgICAgICAgc2VsZi5wcm9ibGVtID0gcHJvYmxlbQorICAgICAgICBzZWxmLnByb2JsZW1fbWFyayA9IHByb2JsZW1fbWFyaworICAgICAgICBzZWxmLm5vdGUgPSBub3RlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBpZiBzZWxmLmNvbnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc2VsZi5jb250ZXh0KQorICAgICAgICBpZiBzZWxmLmNvbnRleHRfbWFyayBpcyBub3QgTm9uZSAgXAorICAgICAgICAgICAgYW5kIChzZWxmLnByb2JsZW0gaXMgTm9uZSBvciBzZWxmLnByb2JsZW1fbWFyayBpcyBOb25lCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuY29udGV4dF9tYXJrLm5hbWUgIT0gc2VsZi5wcm9ibGVtX21hcmsubmFtZQorICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmNvbnRleHRfbWFyay5saW5lICE9IHNlbGYucHJvYmxlbV9tYXJrLmxpbmUKKyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5jb250ZXh0X21hcmsuY29sdW1uICE9IHNlbGYucHJvYmxlbV9tYXJrLmNvbHVtbik6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3RyKHNlbGYuY29udGV4dF9tYXJrKSkKKyAgICAgICAgaWYgc2VsZi5wcm9ibGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYucHJvYmxlbSkKKyAgICAgICAgaWYgc2VsZi5wcm9ibGVtX21hcmsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3RyKHNlbGYucHJvYmxlbV9tYXJrKSkKKyAgICAgICAgaWYgc2VsZi5ub3RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYubm90ZSkKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKKwpkaWZmIC0tZ2l0IGEvbGliL3lhbWwvZXZlbnRzLnB5IGIvbGliL3lhbWwvZXZlbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OWFkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9ldmVudHMucHkKQEAgLTAsMCArMSw4NiBAQAorCisjIEFic3RyYWN0IGNsYXNzZXMuCisKK2NsYXNzIEV2ZW50KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSk6CisgICAgICAgIHNlbGYuc3RhcnRfbWFyayA9IHN0YXJ0X21hcmsKKyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhdHRyaWJ1dGVzID0gW2tleSBmb3Iga2V5IGluIFsnYW5jaG9yJywgJ3RhZycsICdpbXBsaWNpdCcsICd2YWx1ZSddCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBrZXkpXQorICAgICAgICBhcmd1bWVudHMgPSAnLCAnLmpvaW4oWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBhdHRyaWJ1dGVzXSkKKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBhcmd1bWVudHMpCisKK2NsYXNzIE5vZGVFdmVudChFdmVudCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFuY2hvciwgc3RhcnRfbWFyaz1Ob25lLCBlbmRfbWFyaz1Ob25lKToKKyAgICAgICAgc2VsZi5hbmNob3IgPSBhbmNob3IKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgQ29sbGVjdGlvblN0YXJ0RXZlbnQoTm9kZUV2ZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYW5jaG9yLCB0YWcsIGltcGxpY2l0LCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsCisgICAgICAgICAgICBmbG93X3N0eWxlPU5vbmUpOgorICAgICAgICBzZWxmLmFuY2hvciA9IGFuY2hvcgorICAgICAgICBzZWxmLnRhZyA9IHRhZworICAgICAgICBzZWxmLmltcGxpY2l0ID0gaW1wbGljaXQKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICAgICAgc2VsZi5mbG93X3N0eWxlID0gZmxvd19zdHlsZQorCitjbGFzcyBDb2xsZWN0aW9uRW5kRXZlbnQoRXZlbnQpOgorICAgIHBhc3MKKworIyBJbXBsZW1lbnRhdGlvbnMuCisKK2NsYXNzIFN0cmVhbVN0YXJ0RXZlbnQoRXZlbnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworY2xhc3MgU3RyZWFtRW5kRXZlbnQoRXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgRG9jdW1lbnRTdGFydEV2ZW50KEV2ZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnRfbWFyaz1Ob25lLCBlbmRfbWFyaz1Ob25lLAorICAgICAgICAgICAgZXhwbGljaXQ9Tm9uZSwgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmV4cGxpY2l0ID0gZXhwbGljaXQKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLnRhZ3MgPSB0YWdzCisKK2NsYXNzIERvY3VtZW50RW5kRXZlbnQoRXZlbnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsCisgICAgICAgICAgICBleHBsaWNpdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICAgICAgc2VsZi5leHBsaWNpdCA9IGV4cGxpY2l0CisKK2NsYXNzIEFsaWFzRXZlbnQoTm9kZUV2ZW50KToKKyAgICBwYXNzCisKK2NsYXNzIFNjYWxhckV2ZW50KE5vZGVFdmVudCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFuY2hvciwgdGFnLCBpbXBsaWNpdCwgdmFsdWUsCisgICAgICAgICAgICBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIHN0eWxlPU5vbmUpOgorICAgICAgICBzZWxmLmFuY2hvciA9IGFuY2hvcgorICAgICAgICBzZWxmLnRhZyA9IHRhZworICAgICAgICBzZWxmLmltcGxpY2l0ID0gaW1wbGljaXQKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuc3RhcnRfbWFyayA9IHN0YXJ0X21hcmsKKyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisgICAgICAgIHNlbGYuc3R5bGUgPSBzdHlsZQorCitjbGFzcyBTZXF1ZW5jZVN0YXJ0RXZlbnQoQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgU2VxdWVuY2VFbmRFdmVudChDb2xsZWN0aW9uRW5kRXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgTWFwcGluZ1N0YXJ0RXZlbnQoQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgTWFwcGluZ0VuZEV2ZW50KENvbGxlY3Rpb25FbmRFdmVudCk6CisgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIveWFtbC9sb2FkZXIucHkgYi9saWIveWFtbC9sb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzZmY0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi95YW1sL2xvYWRlci5weQpAQCAtMCwwICsxLDQwIEBACisKK19fYWxsX18gPSBbJ0Jhc2VMb2FkZXInLCAnU2FmZUxvYWRlcicsICdMb2FkZXInXQorCitmcm9tIHJlYWRlciBpbXBvcnQgKgorZnJvbSBzY2FubmVyIGltcG9ydCAqCitmcm9tIHBhcnNlciBpbXBvcnQgKgorZnJvbSBjb21wb3NlciBpbXBvcnQgKgorZnJvbSBjb25zdHJ1Y3RvciBpbXBvcnQgKgorZnJvbSByZXNvbHZlciBpbXBvcnQgKgorCitjbGFzcyBCYXNlTG9hZGVyKFJlYWRlciwgU2Nhbm5lciwgUGFyc2VyLCBDb21wb3NlciwgQmFzZUNvbnN0cnVjdG9yLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIEJhc2VDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBCYXNlUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgU2FmZUxvYWRlcihSZWFkZXIsIFNjYW5uZXIsIFBhcnNlciwgQ29tcG9zZXIsIFNhZmVDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBMb2FkZXIoUmVhZGVyLCBTY2FubmVyLCBQYXJzZXIsIENvbXBvc2VyLCBDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbnN0cnVjdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIFJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKZGlmZiAtLWdpdCBhL2xpYi95YW1sL25vZGVzLnB5IGIvbGliL3lhbWwvbm9kZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmMDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi95YW1sL25vZGVzLnB5CkBAIC0wLDAgKzEsNDkgQEAKKworY2xhc3MgTm9kZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWcsIHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyayk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgICNpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgIyAgICBpZiBsZW4odmFsdWUpID09IDA6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzxlbXB0eT4nCisgICAgICAgICMgICAgZWxpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzwxIGl0ZW0+JworICAgICAgICAjICAgIGVsc2U6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzwlZCBpdGVtcz4nICUgbGVuKHZhbHVlKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBpZiBsZW4odmFsdWUpID4gNzU6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gcmVwcih2YWx1ZVs6NzBdK3UnIC4uLiAnKQorICAgICAgICAjICAgIGVsc2U6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gcmVwcih2YWx1ZSkKKyAgICAgICAgdmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICByZXR1cm4gJyVzKHRhZz0lciwgdmFsdWU9JXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi50YWcsIHZhbHVlKQorCitjbGFzcyBTY2FsYXJOb2RlKE5vZGUpOgorICAgIGlkID0gJ3NjYWxhcicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnLCB2YWx1ZSwKKyAgICAgICAgICAgIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSwgc3R5bGU9Tm9uZSk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKKworY2xhc3MgQ29sbGVjdGlvbk5vZGUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhZywgdmFsdWUsCisgICAgICAgICAgICBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmZsb3dfc3R5bGUgPSBmbG93X3N0eWxlCisKK2NsYXNzIFNlcXVlbmNlTm9kZShDb2xsZWN0aW9uTm9kZSk6CisgICAgaWQgPSAnc2VxdWVuY2UnCisKK2NsYXNzIE1hcHBpbmdOb2RlKENvbGxlY3Rpb25Ob2RlKToKKyAgICBpZCA9ICdtYXBwaW5nJworCmRpZmYgLS1naXQgYS9saWIveWFtbC9wYXJzZXIucHkgYi9saWIveWFtbC9wYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMzA1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi95YW1sL3BhcnNlci5weQpAQCAtMCwwICsxLDU4OSBAQAorCisjIFRoZSBmb2xsb3dpbmcgWUFNTCBncmFtbWFyIGlzIExMKDEpIGFuZCBpcyBwYXJzZWQgYnkgYSByZWN1cnNpdmUgZGVzY2VudAorIyBwYXJzZXIuCisjCisjIHN0cmVhbSAgICAgICAgICAgIDo6PSBTVFJFQU0tU1RBUlQgaW1wbGljaXRfZG9jdW1lbnQ/IGV4cGxpY2l0X2RvY3VtZW50KiBTVFJFQU0tRU5ECisjIGltcGxpY2l0X2RvY3VtZW50IDo6PSBibG9ja19ub2RlIERPQ1VNRU5ULUVORCoKKyMgZXhwbGljaXRfZG9jdW1lbnQgOjo9IERJUkVDVElWRSogRE9DVU1FTlQtU1RBUlQgYmxvY2tfbm9kZT8gRE9DVU1FTlQtRU5EKgorIyBibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2UgOjo9CisjICAgICAgICAgICAgICAgICAgICAgICBBTElBUworIyAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIChibG9ja19jb250ZW50IHwgaW5kZW50bGVzc19ibG9ja19zZXF1ZW5jZSk/CisjICAgICAgICAgICAgICAgICAgICAgICB8IGJsb2NrX2NvbnRlbnQKKyMgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZW50bGVzc19ibG9ja19zZXF1ZW5jZQorIyBibG9ja19ub2RlICAgICAgICA6Oj0gQUxJQVMKKyMgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydGllcyBibG9ja19jb250ZW50PworIyAgICAgICAgICAgICAgICAgICAgICAgfCBibG9ja19jb250ZW50CisjIGZsb3dfbm9kZSAgICAgICAgIDo6PSBBTElBUworIyAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIGZsb3dfY29udGVudD8KKyMgICAgICAgICAgICAgICAgICAgICAgIHwgZmxvd19jb250ZW50CisjIHByb3BlcnRpZXMgICAgICAgIDo6PSBUQUcgQU5DSE9SPyB8IEFOQ0hPUiBUQUc/CisjIGJsb2NrX2NvbnRlbnQgICAgIDo6PSBibG9ja19jb2xsZWN0aW9uIHwgZmxvd19jb2xsZWN0aW9uIHwgU0NBTEFSCisjIGZsb3dfY29udGVudCAgICAgIDo6PSBmbG93X2NvbGxlY3Rpb24gfCBTQ0FMQVIKKyMgYmxvY2tfY29sbGVjdGlvbiAgOjo9IGJsb2NrX3NlcXVlbmNlIHwgYmxvY2tfbWFwcGluZworIyBmbG93X2NvbGxlY3Rpb24gICA6Oj0gZmxvd19zZXF1ZW5jZSB8IGZsb3dfbWFwcGluZworIyBibG9ja19zZXF1ZW5jZSAgICA6Oj0gQkxPQ0stU0VRVUVOQ0UtU1RBUlQgKEJMT0NLLUVOVFJZIGJsb2NrX25vZGU/KSogQkxPQ0stRU5ECisjIGluZGVudGxlc3Nfc2VxdWVuY2UgICA6Oj0gKEJMT0NLLUVOVFJZIGJsb2NrX25vZGU/KSsKKyMgYmxvY2tfbWFwcGluZyAgICAgOjo9IEJMT0NLLU1BUFBJTkdfU1RBUlQKKyMgICAgICAgICAgICAgICAgICAgICAgICgoS0VZIGJsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZT8pPworIyAgICAgICAgICAgICAgICAgICAgICAgKFZBTFVFIGJsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZT8pPykqCisjICAgICAgICAgICAgICAgICAgICAgICBCTE9DSy1FTkQKKyMgZmxvd19zZXF1ZW5jZSAgICAgOjo9IEZMT1ctU0VRVUVOQ0UtU1RBUlQKKyMgICAgICAgICAgICAgICAgICAgICAgIChmbG93X3NlcXVlbmNlX2VudHJ5IEZMT1ctRU5UUlkpKgorIyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19zZXF1ZW5jZV9lbnRyeT8KKyMgICAgICAgICAgICAgICAgICAgICAgIEZMT1ctU0VRVUVOQ0UtRU5ECisjIGZsb3dfc2VxdWVuY2VfZW50cnkgICA6Oj0gZmxvd19ub2RlIHwgS0VZIGZsb3dfbm9kZT8gKFZBTFVFIGZsb3dfbm9kZT8pPworIyBmbG93X21hcHBpbmcgICAgICA6Oj0gRkxPVy1NQVBQSU5HLVNUQVJUCisjICAgICAgICAgICAgICAgICAgICAgICAoZmxvd19tYXBwaW5nX2VudHJ5IEZMT1ctRU5UUlkpKgorIyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19tYXBwaW5nX2VudHJ5PworIyAgICAgICAgICAgICAgICAgICAgICAgRkxPVy1NQVBQSU5HLUVORAorIyBmbG93X21hcHBpbmdfZW50cnkgICAgOjo9IGZsb3dfbm9kZSB8IEtFWSBmbG93X25vZGU/IChWQUxVRSBmbG93X25vZGU/KT8KKyMKKyMgRklSU1Qgc2V0czoKKyMKKyMgc3RyZWFtOiB7IFNUUkVBTS1TVEFSVCB9CisjIGV4cGxpY2l0X2RvY3VtZW50OiB7IERJUkVDVElWRSBET0NVTUVOVC1TVEFSVCB9CisjIGltcGxpY2l0X2RvY3VtZW50OiBGSVJTVChibG9ja19ub2RlKQorIyBibG9ja19ub2RlOiB7IEFMSUFTIFRBRyBBTkNIT1IgU0NBTEFSIEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgfQorIyBmbG93X25vZGU6IHsgQUxJQVMgQU5DSE9SIFRBRyBTQ0FMQVIgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgfQorIyBibG9ja19jb250ZW50OiB7IEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgU0NBTEFSIH0KKyMgZmxvd19jb250ZW50OiB7IEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIFNDQUxBUiB9CisjIGJsb2NrX2NvbGxlY3Rpb246IHsgQkxPQ0stU0VRVUVOQ0UtU1RBUlQgQkxPQ0stTUFQUElORy1TVEFSVCB9CisjIGZsb3dfY29sbGVjdGlvbjogeyBGTE9XLVNFUVVFTkNFLVNUQVJUIEZMT1ctTUFQUElORy1TVEFSVCB9CisjIGJsb2NrX3NlcXVlbmNlOiB7IEJMT0NLLVNFUVVFTkNFLVNUQVJUIH0KKyMgYmxvY2tfbWFwcGluZzogeyBCTE9DSy1NQVBQSU5HLVNUQVJUIH0KKyMgYmxvY2tfbm9kZV9vcl9pbmRlbnRsZXNzX3NlcXVlbmNlOiB7IEFMSUFTIEFOQ0hPUiBUQUcgU0NBTEFSIEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgQkxPQ0stRU5UUlkgfQorIyBpbmRlbnRsZXNzX3NlcXVlbmNlOiB7IEVOVFJZIH0KKyMgZmxvd19jb2xsZWN0aW9uOiB7IEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIH0KKyMgZmxvd19zZXF1ZW5jZTogeyBGTE9XLVNFUVVFTkNFLVNUQVJUIH0KKyMgZmxvd19tYXBwaW5nOiB7IEZMT1ctTUFQUElORy1TVEFSVCB9CisjIGZsb3dfc2VxdWVuY2VfZW50cnk6IHsgQUxJQVMgQU5DSE9SIFRBRyBTQ0FMQVIgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgS0VZIH0KKyMgZmxvd19tYXBwaW5nX2VudHJ5OiB7IEFMSUFTIEFOQ0hPUiBUQUcgU0NBTEFSIEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIEtFWSB9CisKK19fYWxsX18gPSBbJ1BhcnNlcicsICdQYXJzZXJFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0IE1hcmtlZFlBTUxFcnJvcgorZnJvbSB0b2tlbnMgaW1wb3J0ICoKK2Zyb20gZXZlbnRzIGltcG9ydCAqCitmcm9tIHNjYW5uZXIgaW1wb3J0ICoKKworY2xhc3MgUGFyc2VyRXJyb3IoTWFya2VkWUFNTEVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIFBhcnNlcihvYmplY3QpOgorICAgICMgU2luY2Ugd3JpdGluZyBhIHJlY3Vyc2l2ZS1kZXNjZW5kYW50IHBhcnNlciBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCB0YXNrLCB3ZQorICAgICMgZG8gbm90IGdpdmUgbWFueSBjb21tZW50cyBoZXJlLgorCisgICAgREVGQVVMVF9UQUdTID0geworICAgICAgICB1JyEnOiAgIHUnIScsCisgICAgICAgIHUnISEnOiAgdSd0YWc6eWFtbC5vcmcsMjAwMjonLAorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jdXJyZW50X2V2ZW50ID0gTm9uZQorICAgICAgICBzZWxmLnlhbWxfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgc2VsZi50YWdfaGFuZGxlcyA9IHt9CisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5tYXJrcyA9IFtdCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX3N0cmVhbV9zdGFydAorCisgICAgZGVmIGRpc3Bvc2Uoc2VsZik6CisgICAgICAgICMgUmVzZXQgdGhlIHN0YXRlIGF0dHJpYnV0ZXMgKHRvIGNsZWFyIHNlbGYtcmVmZXJlbmNlcykKKyAgICAgICAgc2VsZi5zdGF0ZXMgPSBbXQorICAgICAgICBzZWxmLnN0YXRlID0gTm9uZQorCisgICAgZGVmIGNoZWNrX2V2ZW50KHNlbGYsICpjaG9pY2VzKToKKyAgICAgICAgIyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgbmV4dCBldmVudC4KKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2V2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRlOgorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9ldmVudCA9IHNlbGYuc3RhdGUoKQorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfZXZlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgY2hvaWNlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZm9yIGNob2ljZSBpbiBjaG9pY2VzOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jdXJyZW50X2V2ZW50LCBjaG9pY2UpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBwZWVrX2V2ZW50KHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgbmV4dCBldmVudC4KKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2V2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRlOgorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9ldmVudCA9IHNlbGYuc3RhdGUoKQorICAgICAgICByZXR1cm4gc2VsZi5jdXJyZW50X2V2ZW50CisKKyAgICBkZWYgZ2V0X2V2ZW50KHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgbmV4dCBldmVudCBhbmQgcHJvY2VlZCBmdXJ0aGVyLgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfZXZlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhdGU6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2V2ZW50ID0gc2VsZi5zdGF0ZSgpCisgICAgICAgIHZhbHVlID0gc2VsZi5jdXJyZW50X2V2ZW50CisgICAgICAgIHNlbGYuY3VycmVudF9ldmVudCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAjIHN0cmVhbSAgICA6Oj0gU1RSRUFNLVNUQVJUIGltcGxpY2l0X2RvY3VtZW50PyBleHBsaWNpdF9kb2N1bWVudCogU1RSRUFNLUVORAorICAgICMgaW1wbGljaXRfZG9jdW1lbnQgOjo9IGJsb2NrX25vZGUgRE9DVU1FTlQtRU5EKgorICAgICMgZXhwbGljaXRfZG9jdW1lbnQgOjo9IERJUkVDVElWRSogRE9DVU1FTlQtU1RBUlQgYmxvY2tfbm9kZT8gRE9DVU1FTlQtRU5EKgorCisgICAgZGVmIHBhcnNlX3N0cmVhbV9zdGFydChzZWxmKToKKworICAgICAgICAjIFBhcnNlIHRoZSBzdHJlYW0gc3RhcnQuCisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBldmVudCA9IFN0cmVhbVN0YXJ0RXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmssCisgICAgICAgICAgICAgICAgZW5jb2Rpbmc9dG9rZW4uZW5jb2RpbmcpCisKKyAgICAgICAgIyBQcmVwYXJlIHRoZSBuZXh0IHN0YXRlLgorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9pbXBsaWNpdF9kb2N1bWVudF9zdGFydAorCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgZGVmIHBhcnNlX2ltcGxpY2l0X2RvY3VtZW50X3N0YXJ0KHNlbGYpOgorCisgICAgICAgICMgUGFyc2UgYW4gaW1wbGljaXQgZG9jdW1lbnQuCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKERpcmVjdGl2ZVRva2VuLCBEb2N1bWVudFN0YXJ0VG9rZW4sCisgICAgICAgICAgICAgICAgU3RyZWFtRW5kVG9rZW4pOgorICAgICAgICAgICAgc2VsZi50YWdfaGFuZGxlcyA9IHNlbGYuREVGQVVMVF9UQUdTCisgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICBzdGFydF9tYXJrID0gZW5kX21hcmsgPSB0b2tlbi5zdGFydF9tYXJrCisgICAgICAgICAgICBldmVudCA9IERvY3VtZW50U3RhcnRFdmVudChzdGFydF9tYXJrLCBlbmRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ9RmFsc2UpCisKKyAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgbmV4dCBzdGF0ZS4KKyAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2RvY3VtZW50X2VuZCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Jsb2NrX25vZGUKKworICAgICAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2RvY3VtZW50X3N0YXJ0KCkKKworICAgIGRlZiBwYXJzZV9kb2N1bWVudF9zdGFydChzZWxmKToKKworICAgICAgICAjIFBhcnNlIGFueSBleHRyYSBkb2N1bWVudCBlbmQgaW5kaWNhdG9ycy4KKyAgICAgICAgd2hpbGUgc2VsZi5jaGVja190b2tlbihEb2N1bWVudEVuZFRva2VuKToKKyAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKCkKKworICAgICAgICAjIFBhcnNlIGFuIGV4cGxpY2l0IGRvY3VtZW50LgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihTdHJlYW1FbmRUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICBzdGFydF9tYXJrID0gdG9rZW4uc3RhcnRfbWFyaworICAgICAgICAgICAgdmVyc2lvbiwgdGFncyA9IHNlbGYucHJvY2Vzc19kaXJlY3RpdmVzKCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKERvY3VtZW50U3RhcnRUb2tlbik6CisgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnPGRvY3VtZW50IHN0YXJ0PicsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgc2VsZi5wZWVrX3Rva2VuKCkuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBlZWtfdG9rZW4oKS5zdGFydF9tYXJrKQorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBlbmRfbWFyayA9IHRva2VuLmVuZF9tYXJrCisgICAgICAgICAgICBldmVudCA9IERvY3VtZW50U3RhcnRFdmVudChzdGFydF9tYXJrLCBlbmRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ9VHJ1ZSwgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9kb2N1bWVudF9lbmQpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9kb2N1bWVudF9jb250ZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcnNlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgZXZlbnQgPSBTdHJlYW1FbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgICAgIGFzc2VydCBub3Qgc2VsZi5zdGF0ZXMKKyAgICAgICAgICAgIGFzc2VydCBub3Qgc2VsZi5tYXJrcworICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICBkZWYgcGFyc2VfZG9jdW1lbnRfZW5kKHNlbGYpOgorCisgICAgICAgICMgUGFyc2UgdGhlIGRvY3VtZW50IGVuZC4KKyAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICBzdGFydF9tYXJrID0gZW5kX21hcmsgPSB0b2tlbi5zdGFydF9tYXJrCisgICAgICAgIGV4cGxpY2l0ID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihEb2N1bWVudEVuZFRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgZXhwbGljaXQgPSBUcnVlCisgICAgICAgIGV2ZW50ID0gRG9jdW1lbnRFbmRFdmVudChzdGFydF9tYXJrLCBlbmRfbWFyaywKKyAgICAgICAgICAgICAgICBleHBsaWNpdD1leHBsaWNpdCkKKworICAgICAgICAjIFByZXBhcmUgdGhlIG5leHQgc3RhdGUuCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2RvY3VtZW50X3N0YXJ0CisKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICBkZWYgcGFyc2VfZG9jdW1lbnRfY29udGVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihEaXJlY3RpdmVUb2tlbiwKKyAgICAgICAgICAgICAgICBEb2N1bWVudFN0YXJ0VG9rZW4sIERvY3VtZW50RW5kVG9rZW4sIFN0cmVhbUVuZFRva2VuKToKKyAgICAgICAgICAgIGV2ZW50ID0gc2VsZi5wcm9jZXNzX2VtcHR5X3NjYWxhcihzZWxmLnBlZWtfdG9rZW4oKS5zdGFydF9tYXJrKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgICAgICByZXR1cm4gZXZlbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX25vZGUoKQorCisgICAgZGVmIHByb2Nlc3NfZGlyZWN0aXZlcyhzZWxmKToKKyAgICAgICAgc2VsZi55YW1sX3ZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYudGFnX2hhbmRsZXMgPSB7fQorICAgICAgICB3aGlsZSBzZWxmLmNoZWNrX3Rva2VuKERpcmVjdGl2ZVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgdG9rZW4ubmFtZSA9PSB1J1lBTUwnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYueWFtbF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBkdXBsaWNhdGUgWUFNTCBkaXJlY3RpdmUiLCB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vciA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICAgICAgaWYgbWFqb3IgIT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgaW5jb21wYXRpYmxlIFlBTUwgZG9jdW1lbnQgKHZlcnNpb24gMS4qIGlzIHJlcXVpcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgICAgICAgICBzZWxmLnlhbWxfdmVyc2lvbiA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gdSdUQUcnOgorICAgICAgICAgICAgICAgIGhhbmRsZSwgcHJlZml4ID0gdG9rZW4udmFsdWUKKyAgICAgICAgICAgICAgICBpZiBoYW5kbGUgaW4gc2VsZi50YWdfaGFuZGxlczoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHRhZyBoYW5kbGUgJXIiICUgaGFuZGxlLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICAgICAgICAgIHNlbGYudGFnX2hhbmRsZXNbaGFuZGxlXSA9IHByZWZpeAorICAgICAgICBpZiBzZWxmLnRhZ19oYW5kbGVzOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnlhbWxfdmVyc2lvbiwgc2VsZi50YWdfaGFuZGxlcy5jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi55YW1sX3ZlcnNpb24sIE5vbmUKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLkRFRkFVTFRfVEFHUzoKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi50YWdfaGFuZGxlczoKKyAgICAgICAgICAgICAgICBzZWxmLnRhZ19oYW5kbGVzW2tleV0gPSBzZWxmLkRFRkFVTFRfVEFHU1trZXldCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgIyBibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2UgOjo9IEFMSUFTCisgICAgIyAgICAgICAgICAgICAgIHwgcHJvcGVydGllcyAoYmxvY2tfY29udGVudCB8IGluZGVudGxlc3NfYmxvY2tfc2VxdWVuY2UpPworICAgICMgICAgICAgICAgICAgICB8IGJsb2NrX2NvbnRlbnQKKyAgICAjICAgICAgICAgICAgICAgfCBpbmRlbnRsZXNzX2Jsb2NrX3NlcXVlbmNlCisgICAgIyBibG9ja19ub2RlICAgIDo6PSBBTElBUworICAgICMgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIGJsb2NrX2NvbnRlbnQ/CisgICAgIyAgICAgICAgICAgICAgICAgICB8IGJsb2NrX2NvbnRlbnQKKyAgICAjIGZsb3dfbm9kZSAgICAgOjo9IEFMSUFTCisgICAgIyAgICAgICAgICAgICAgICAgICB8IHByb3BlcnRpZXMgZmxvd19jb250ZW50PworICAgICMgICAgICAgICAgICAgICAgICAgfCBmbG93X2NvbnRlbnQKKyAgICAjIHByb3BlcnRpZXMgICAgOjo9IFRBRyBBTkNIT1I/IHwgQU5DSE9SIFRBRz8KKyAgICAjIGJsb2NrX2NvbnRlbnQgICAgIDo6PSBibG9ja19jb2xsZWN0aW9uIHwgZmxvd19jb2xsZWN0aW9uIHwgU0NBTEFSCisgICAgIyBmbG93X2NvbnRlbnQgICAgICA6Oj0gZmxvd19jb2xsZWN0aW9uIHwgU0NBTEFSCisgICAgIyBibG9ja19jb2xsZWN0aW9uICA6Oj0gYmxvY2tfc2VxdWVuY2UgfCBibG9ja19tYXBwaW5nCisgICAgIyBmbG93X2NvbGxlY3Rpb24gICA6Oj0gZmxvd19zZXF1ZW5jZSB8IGZsb3dfbWFwcGluZworCisgICAgZGVmIHBhcnNlX2Jsb2NrX25vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX25vZGUoYmxvY2s9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9mbG93X25vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX25vZGUoKQorCisgICAgZGVmIHBhcnNlX2Jsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2Vfbm9kZShibG9jaz1UcnVlLCBpbmRlbnRsZXNzX3NlcXVlbmNlPVRydWUpCisKKyAgICBkZWYgcGFyc2Vfbm9kZShzZWxmLCBibG9jaz1GYWxzZSwgaW5kZW50bGVzc19zZXF1ZW5jZT1GYWxzZSk6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oQWxpYXNUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGV2ZW50ID0gQWxpYXNFdmVudCh0b2tlbi52YWx1ZSwgdG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmspCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFuY2hvciA9IE5vbmUKKyAgICAgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgICAgIHN0YXJ0X21hcmsgPSBlbmRfbWFyayA9IHRhZ19tYXJrID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihBbmNob3JUb2tlbik6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgc3RhcnRfbWFyayA9IHRva2VuLnN0YXJ0X21hcmsKKyAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHRva2VuLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW4udmFsdWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKFRhZ1Rva2VuKToKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgICAgIHRhZ19tYXJrID0gdG9rZW4uc3RhcnRfbWFyaworICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHRva2VuLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgICAgIHRhZyA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICBlbGlmIHNlbGYuY2hlY2tfdG9rZW4oVGFnVG9rZW4pOgorICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIHN0YXJ0X21hcmsgPSB0YWdfbWFyayA9IHRva2VuLnN0YXJ0X21hcmsKKyAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHRva2VuLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgdGFnID0gdG9rZW4udmFsdWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKEFuY2hvclRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgICAgIGVuZF9tYXJrID0gdG9rZW4uZW5kX21hcmsKKyAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW4udmFsdWUKKyAgICAgICAgICAgIGlmIHRhZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBoYW5kbGUsIHN1ZmZpeCA9IHRhZworICAgICAgICAgICAgICAgIGlmIGhhbmRsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFuZGxlIG5vdCBpbiBzZWxmLnRhZ19oYW5kbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSBub2RlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvdW5kIHVuZGVmaW5lZCB0YWcgaGFuZGxlICVyIiAlIGhhbmRsZS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19tYXJrKQorICAgICAgICAgICAgICAgICAgICB0YWcgPSBzZWxmLnRhZ19oYW5kbGVzW2hhbmRsZV0rc3VmZml4CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFnID0gc3VmZml4CisgICAgICAgICAgICAjaWYgdGFnID09IHUnISc6CisgICAgICAgICAgICAjICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgbm9kZSIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAjICAgICAgICAgICAgImZvdW5kIG5vbi1zcGVjaWZpYyB0YWcgJyEnIiwgdGFnX21hcmssCisgICAgICAgICAgICAjICAgICAgICAgICAgIlBsZWFzZSBjaGVjayAnaHR0cDovL3B5eWFtbC5vcmcvd2lraS9ZQU1MTm9uU3BlY2lmaWNUYWcnIGFuZCBzaGFyZSB5b3VyIG9waW5pb24uIikKKyAgICAgICAgICAgIGlmIHN0YXJ0X21hcmsgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzdGFydF9tYXJrID0gZW5kX21hcmsgPSBzZWxmLnBlZWtfdG9rZW4oKS5zdGFydF9tYXJrCisgICAgICAgICAgICBldmVudCA9IE5vbmUKKyAgICAgICAgICAgIGltcGxpY2l0ID0gKHRhZyBpcyBOb25lIG9yIHRhZyA9PSB1JyEnKQorICAgICAgICAgICAgaWYgaW5kZW50bGVzc19zZXF1ZW5jZSBhbmQgc2VsZi5jaGVja190b2tlbihCbG9ja0VudHJ5VG9rZW4pOgorICAgICAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5wZWVrX3Rva2VuKCkuZW5kX21hcmsKKyAgICAgICAgICAgICAgICBldmVudCA9IFNlcXVlbmNlU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9pbmRlbnRsZXNzX3NlcXVlbmNlX2VudHJ5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oU2NhbGFyVG9rZW4pOgorICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4ucGxhaW4gYW5kIHRhZyBpcyBOb25lKSBvciB0YWcgPT0gdSchJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gKFRydWUsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHRhZyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAoRmFsc2UsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IChGYWxzZSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2NhbGFyRXZlbnQoYW5jaG9yLCB0YWcsIGltcGxpY2l0LCB0b2tlbi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaywgc3R5bGU9dG9rZW4uc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jaGVja190b2tlbihGbG93U2VxdWVuY2VTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLnBlZWtfdG9rZW4oKS5lbmRfbWFyaworICAgICAgICAgICAgICAgICAgICBldmVudCA9IFNlcXVlbmNlU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIGZsb3dfc3R5bGU9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9maXJzdF9lbnRyeQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jaGVja190b2tlbihGbG93TWFwcGluZ1N0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gTWFwcGluZ1N0YXJ0RXZlbnQoYW5jaG9yLCB0YWcsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBmbG93X3N0eWxlPVRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19maXJzdF9rZXkKKyAgICAgICAgICAgICAgICBlbGlmIGJsb2NrIGFuZCBzZWxmLmNoZWNrX3Rva2VuKEJsb2NrU2VxdWVuY2VTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLnBlZWtfdG9rZW4oKS5zdGFydF9tYXJrCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2VxdWVuY2VTdGFydEV2ZW50KGFuY2hvciwgdGFnLCBpbXBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaywgZmxvd19zdHlsZT1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfYmxvY2tfc2VxdWVuY2VfZmlyc3RfZW50cnkKKyAgICAgICAgICAgICAgICBlbGlmIGJsb2NrIGFuZCBzZWxmLmNoZWNrX3Rva2VuKEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLnN0YXJ0X21hcmsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBNYXBwaW5nU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIGZsb3dfc3R5bGU9RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfZmlyc3Rfa2V5CisgICAgICAgICAgICAgICAgZWxpZiBhbmNob3IgaXMgbm90IE5vbmUgb3IgdGFnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IHNjYWxhcnMgYXJlIGFsbG93ZWQgZXZlbiBpZiBhIHRhZyBvciBhbiBhbmNob3IgaXMKKyAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2NhbGFyRXZlbnQoYW5jaG9yLCB0YWcsIChpbXBsaWNpdCwgRmFsc2UpLCB1JycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9ICdibG9jaycKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAnZmxvdycKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcigid2hpbGUgcGFyc2luZyBhICVzIG5vZGUiICUgbm9kZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdGhlIG5vZGUgY29udGVudCwgYnV0IGZvdW5kICVyIiAlIHRva2VuLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgIyBibG9ja19zZXF1ZW5jZSA6Oj0gQkxPQ0stU0VRVUVOQ0UtU1RBUlQgKEJMT0NLLUVOVFJZIGJsb2NrX25vZGU/KSogQkxPQ0stRU5ECisKKyAgICBkZWYgcGFyc2VfYmxvY2tfc2VxdWVuY2VfZmlyc3RfZW50cnkoc2VsZik6CisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBzZWxmLm1hcmtzLmFwcGVuZCh0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19zZXF1ZW5jZV9lbnRyeSgpCisKKyAgICBkZWYgcGFyc2VfYmxvY2tfc2VxdWVuY2VfZW50cnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbnRyeVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbnRyeVRva2VuLCBCbG9ja0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9ibG9ja19zZXF1ZW5jZV9lbnRyeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19ub2RlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfYmxvY2tfc2VxdWVuY2VfZW50cnkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2VtcHR5X3NjYWxhcih0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbmRUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcigid2hpbGUgcGFyc2luZyBhIGJsb2NrIGNvbGxlY3Rpb24iLCBzZWxmLm1hcmtzWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIDxibG9jayBlbmQ+LCBidXQgZm91bmQgJXIiICUgdG9rZW4uaWQsIHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBldmVudCA9IFNlcXVlbmNlRW5kRXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmspCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBzZWxmLm1hcmtzLnBvcCgpCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgIyBpbmRlbnRsZXNzX3NlcXVlbmNlIDo6PSAoQkxPQ0stRU5UUlkgYmxvY2tfbm9kZT8pKworCisgICAgZGVmIHBhcnNlX2luZGVudGxlc3Nfc2VxdWVuY2VfZW50cnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbnRyeVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbnRyeVRva2VuLAorICAgICAgICAgICAgICAgICAgICBLZXlUb2tlbiwgVmFsdWVUb2tlbiwgQmxvY2tFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYucGFyc2VfaW5kZW50bGVzc19zZXF1ZW5jZV9lbnRyeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19ub2RlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfaW5kZW50bGVzc19zZXF1ZW5jZV9lbnRyeQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgIGV2ZW50ID0gU2VxdWVuY2VFbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICAjIGJsb2NrX21hcHBpbmcgICAgIDo6PSBCTE9DSy1NQVBQSU5HX1NUQVJUCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgKChLRVkgYmxvY2tfbm9kZV9vcl9pbmRlbnRsZXNzX3NlcXVlbmNlPyk/CisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgKFZBTFVFIGJsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZT8pPykqCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0stRU5ECisKKyAgICBkZWYgcGFyc2VfYmxvY2tfbWFwcGluZ19maXJzdF9rZXkoc2VsZik6CisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBzZWxmLm1hcmtzLmFwcGVuZCh0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX2tleSgpCisKKyAgICBkZWYgcGFyc2VfYmxvY2tfbWFwcGluZ19rZXkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oS2V5VG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihLZXlUb2tlbiwgVmFsdWVUb2tlbiwgQmxvY2tFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYucGFyc2VfYmxvY2tfbWFwcGluZ192YWx1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX3ZhbHVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uZW5kX21hcmspCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKEJsb2NrRW5kVG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSBibG9jayBtYXBwaW5nIiwgc2VsZi5tYXJrc1stMV0sCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCA8YmxvY2sgZW5kPiwgYnV0IGZvdW5kICVyIiAlIHRva2VuLmlkLCB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgZXZlbnQgPSBNYXBwaW5nRW5kRXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmspCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBzZWxmLm1hcmtzLnBvcCgpCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgZGVmIHBhcnNlX2Jsb2NrX21hcHBpbmdfdmFsdWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oVmFsdWVUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKEtleVRva2VuLCBWYWx1ZVRva2VuLCBCbG9ja0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX2tleSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX2tleQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfYmxvY2tfbWFwcGluZ19rZXkKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLnN0YXJ0X21hcmspCisKKyAgICAjIGZsb3dfc2VxdWVuY2UgICAgIDo6PSBGTE9XLVNFUVVFTkNFLVNUQVJUCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgKGZsb3dfc2VxdWVuY2VfZW50cnkgRkxPVy1FTlRSWSkqCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19zZXF1ZW5jZV9lbnRyeT8KKyAgICAjICAgICAgICAgICAgICAgICAgICAgICBGTE9XLVNFUVVFTkNFLUVORAorICAgICMgZmxvd19zZXF1ZW5jZV9lbnRyeSAgIDo6PSBmbG93X25vZGUgfCBLRVkgZmxvd19ub2RlPyAoVkFMVUUgZmxvd19ub2RlPyk/CisgICAgIworICAgICMgTm90ZSB0aGF0IHdoaWxlIHByb2R1Y3Rpb24gcnVsZXMgZm9yIGJvdGggZmxvd19zZXF1ZW5jZV9lbnRyeSBhbmQKKyAgICAjIGZsb3dfbWFwcGluZ19lbnRyeSBhcmUgZXF1YWwsIHRoZWlyIGludGVycHJldGF0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgICMgRm9yIGBmbG93X3NlcXVlbmNlX2VudHJ5YCwgdGhlIHBhcnQgYEtFWSBmbG93X25vZGU/IChWQUxVRSBmbG93X25vZGU/KT9gCisgICAgIyBnZW5lcmF0ZSBhbiBpbmxpbmUgbWFwcGluZyAoc2V0IHN5bnRheCkuCisKKyAgICBkZWYgcGFyc2VfZmxvd19zZXF1ZW5jZV9maXJzdF9lbnRyeShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIHNlbGYubWFya3MuYXBwZW5kKHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnkoZmlyc3Q9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5KHNlbGYsIGZpcnN0PUZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgaWYgbm90IGZpcnN0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oRmxvd0VudHJ5VG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcigid2hpbGUgcGFyc2luZyBhIGZsb3cgc2VxdWVuY2UiLCBzZWxmLm1hcmtzWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJywnIG9yICddJywgYnV0IGdvdCAlciIgJSB0b2tlbi5pZCwgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihLZXlUb2tlbik6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgICAgIGV2ZW50ID0gTWFwcGluZ1N0YXJ0RXZlbnQoTm9uZSwgTm9uZSwgVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0YXJ0X21hcmssIHRva2VuLmVuZF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19zdHlsZT1UcnVlKQorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ19rZXkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQKKyAgICAgICAgICAgIGVsaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIGV2ZW50ID0gU2VxdWVuY2VFbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIHNlbGYubWFya3MucG9wKCkKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICBkZWYgcGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX2tleShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKFZhbHVlVG9rZW4sCisgICAgICAgICAgICAgICAgRmxvd0VudHJ5VG9rZW4sIEZsb3dTZXF1ZW5jZUVuZFRva2VuKToKKyAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ192YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfbm9kZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5X21hcHBpbmdfdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorCisgICAgZGVmIHBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ192YWx1ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihWYWx1ZVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oRmxvd0VudHJ5VG9rZW4sIEZsb3dTZXF1ZW5jZUVuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5X21hcHBpbmdfZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfbm9kZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ19lbmQKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2VtcHR5X3NjYWxhcih0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ19lbmQKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLnN0YXJ0X21hcmspCisKKyAgICBkZWYgcGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX2VuZChzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeQorICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgIHJldHVybiBNYXBwaW5nRW5kRXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uc3RhcnRfbWFyaykKKworICAgICMgZmxvd19tYXBwaW5nICA6Oj0gRkxPVy1NQVBQSU5HLVNUQVJUCisgICAgIyAgICAgICAgICAgICAgICAgICAoZmxvd19tYXBwaW5nX2VudHJ5IEZMT1ctRU5UUlkpKgorICAgICMgICAgICAgICAgICAgICAgICAgZmxvd19tYXBwaW5nX2VudHJ5PworICAgICMgICAgICAgICAgICAgICAgICAgRkxPVy1NQVBQSU5HLUVORAorICAgICMgZmxvd19tYXBwaW5nX2VudHJ5ICAgIDo6PSBmbG93X25vZGUgfCBLRVkgZmxvd19ub2RlPyAoVkFMVUUgZmxvd19ub2RlPyk/CisKKyAgICBkZWYgcGFyc2VfZmxvd19tYXBwaW5nX2ZpcnN0X2tleShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIHNlbGYubWFya3MuYXBwZW5kKHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19rZXkoZmlyc3Q9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9mbG93X21hcHBpbmdfa2V5KHNlbGYsIGZpcnN0PUZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oRmxvd01hcHBpbmdFbmRUb2tlbik6CisgICAgICAgICAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihGbG93RW50cnlUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgZmxvdyBtYXBwaW5nIiwgc2VsZi5tYXJrc1stMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICcsJyBvciAnfScsIGJ1dCBnb3QgJXIiICUgdG9rZW4uaWQsIHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKEtleVRva2VuKToKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihWYWx1ZVRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgRmxvd0VudHJ5VG9rZW4sIEZsb3dNYXBwaW5nRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9mbG93X21hcHBpbmdfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfbm9kZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19tYXBwaW5nX3ZhbHVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5jaGVja190b2tlbihGbG93TWFwcGluZ0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9mbG93X21hcHBpbmdfZW1wdHlfdmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIGV2ZW50ID0gTWFwcGluZ0VuZEV2ZW50KHRva2VuLnN0YXJ0X21hcmssIHRva2VuLmVuZF9tYXJrKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgc2VsZi5tYXJrcy5wb3AoKQorICAgICAgICByZXR1cm4gZXZlbnQKKworICAgIGRlZiBwYXJzZV9mbG93X21hcHBpbmdfdmFsdWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oVmFsdWVUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKEZsb3dFbnRyeVRva2VuLCBGbG93TWFwcGluZ0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9mbG93X21hcHBpbmdfa2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Zsb3dfbm9kZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19rZXkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2VtcHR5X3NjYWxhcih0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19rZXkKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLnN0YXJ0X21hcmspCisKKyAgICBkZWYgcGFyc2VfZmxvd19tYXBwaW5nX2VtcHR5X3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9mbG93X21hcHBpbmdfa2V5CisgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHNlbGYucGVla190b2tlbigpLnN0YXJ0X21hcmspCisKKyAgICBkZWYgcHJvY2Vzc19lbXB0eV9zY2FsYXIoc2VsZiwgbWFyayk6CisgICAgICAgIHJldHVybiBTY2FsYXJFdmVudChOb25lLCBOb25lLCAoVHJ1ZSwgRmFsc2UpLCB1JycsIG1hcmssIG1hcmspCisKZGlmZiAtLWdpdCBhL2xpYi95YW1sL3JlYWRlci5weSBiL2xpYi95YW1sL3JlYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ5ZTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvcmVhZGVyLnB5CkBAIC0wLDAgKzEsMTkwIEBACisjIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFic3RyYWN0aW9ucyBmb3IgdGhlIGlucHV0IHN0cmVhbS4gWW91IGRvbid0IGhhdmUgdG8KKyMgbG9va3MgZnVydGhlciwgdGhlcmUgYXJlIG5vIHByZXR0eSBjb2RlLgorIworIyBXZSBkZWZpbmUgdHdvIGNsYXNzZXMgaGVyZS4KKyMKKyMgICBNYXJrKHNvdXJjZSwgbGluZSwgY29sdW1uKQorIyBJdCdzIGp1c3QgYSByZWNvcmQgYW5kIGl0cyBvbmx5IHVzZSBpcyBwcm9kdWNpbmcgbmljZSBlcnJvciBtZXNzYWdlcy4KKyMgUGFyc2VyIGRvZXMgbm90IHVzZSBpdCBmb3IgYW55IG90aGVyIHB1cnBvc2VzLgorIworIyAgIFJlYWRlcihzb3VyY2UsIGRhdGEpCisjIFJlYWRlciBkZXRlcm1pbmVzIHRoZSBlbmNvZGluZyBvZiBgZGF0YWAgYW5kIGNvbnZlcnRzIGl0IHRvIHVuaWNvZGUuCisjIFJlYWRlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXM6CisjICAgcmVhZGVyLnBlZWsobGVuZ3RoPTEpIC0gcmV0dXJuIHRoZSBuZXh0IGBsZW5ndGhgIGNoYXJhY3RlcnMKKyMgICByZWFkZXIuZm9yd2FyZChsZW5ndGg9MSkgLSBtb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIGBsZW5ndGhgIGNoYXJhY3RlcnMuCisjICAgcmVhZGVyLmluZGV4IC0gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIuCisjICAgcmVhZGVyLmxpbmUsIHN0cmVhbS5jb2x1bW4gLSB0aGUgbGluZSBhbmQgdGhlIGNvbHVtbiBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIuCisKK19fYWxsX18gPSBbJ1JlYWRlcicsICdSZWFkZXJFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0IFlBTUxFcnJvciwgTWFyaworCitpbXBvcnQgY29kZWNzLCByZQorCitjbGFzcyBSZWFkZXJFcnJvcihZQU1MRXJyb3IpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBvc2l0aW9uLCBjaGFyYWN0ZXIsIGVuY29kaW5nLCByZWFzb24pOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY2hhcmFjdGVyID0gY2hhcmFjdGVyCisgICAgICAgIHNlbGYucG9zaXRpb24gPSBwb3NpdGlvbgorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY2hhcmFjdGVyLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuICInJXMnIGNvZGVjIGNhbid0IGRlY29kZSBieXRlICN4JTAyeDogJXNcbiIgIFwKKyAgICAgICAgICAgICAgICAgICAgIiAgaW4gXCIlc1wiLCBwb3NpdGlvbiAlZCIgICAgXAorICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmVuY29kaW5nLCBvcmQoc2VsZi5jaGFyYWN0ZXIpLCBzZWxmLnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucG9zaXRpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gInVuYWNjZXB0YWJsZSBjaGFyYWN0ZXIgI3glMDR4OiAlc1xuIiAgICBcCisgICAgICAgICAgICAgICAgICAgICIgIGluIFwiJXNcIiwgcG9zaXRpb24gJWQiICAgIFwKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5jaGFyYWN0ZXIsIHNlbGYucmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5wb3NpdGlvbikKKworY2xhc3MgUmVhZGVyKG9iamVjdCk6CisgICAgIyBSZWFkZXI6CisgICAgIyAtIGRldGVybWluZXMgdGhlIGRhdGEgZW5jb2RpbmcgYW5kIGNvbnZlcnRzIGl0IHRvIHVuaWNvZGUsCisgICAgIyAtIGNoZWNrcyBpZiBjaGFyYWN0ZXJzIGFyZSBpbiBhbGxvd2VkIHJhbmdlLAorICAgICMgLSBhZGRzICdcMCcgdG8gdGhlIGVuZC4KKworICAgICMgUmVhZGVyIGFjY2VwdHMKKyAgICAjICAtIGEgYHN0cmAgb2JqZWN0LAorICAgICMgIC0gYSBgdW5pY29kZWAgb2JqZWN0LAorICAgICMgIC0gYSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggaXRzIGByZWFkYCBtZXRob2QgcmV0dXJuaW5nIGBzdHJgLAorICAgICMgIC0gYSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggaXRzIGByZWFkYCBtZXRob2QgcmV0dXJuaW5nIGB1bmljb2RlYC4KKworICAgICMgWWVhaCwgaXQncyB1Z2x5IGFuZCBzbG93LgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lCisgICAgICAgIHNlbGYuc3RyZWFtX3BvaW50ZXIgPSAwCisgICAgICAgIHNlbGYuZW9mID0gVHJ1ZQorICAgICAgICBzZWxmLmJ1ZmZlciA9IHUnJworICAgICAgICBzZWxmLnBvaW50ZXIgPSAwCisgICAgICAgIHNlbGYucmF3X2J1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5yYXdfZGVjb2RlID0gTm9uZQorICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQorICAgICAgICBzZWxmLmluZGV4ID0gMAorICAgICAgICBzZWxmLmxpbmUgPSAwCisgICAgICAgIHNlbGYuY29sdW1uID0gMAorICAgICAgICBpZiBpc2luc3RhbmNlKHN0cmVhbSwgdW5pY29kZSk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSAiPHVuaWNvZGUgc3RyaW5nPiIKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcHJpbnRhYmxlKHN0cmVhbSkKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc3RyZWFtK3UnXDAnCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzdHJlYW0sIHN0cik6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSAiPHN0cmluZz4iCisgICAgICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBzdHJlYW0KKyAgICAgICAgICAgIHNlbGYuZGV0ZXJtaW5lX2VuY29kaW5nKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHN0cmVhbSwgJ25hbWUnLCAiPGZpbGU+IikKKyAgICAgICAgICAgIHNlbGYuZW9mID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYucmF3X2J1ZmZlciA9ICcnCisgICAgICAgICAgICBzZWxmLmRldGVybWluZV9lbmNvZGluZygpCisKKyAgICBkZWYgcGVlayhzZWxmLCBpbmRleD0wKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyW3NlbGYucG9pbnRlcitpbmRleF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShpbmRleCsxKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyW3NlbGYucG9pbnRlcitpbmRleF0KKworICAgIGRlZiBwcmVmaXgoc2VsZiwgbGVuZ3RoPTEpOgorICAgICAgICBpZiBzZWxmLnBvaW50ZXIrbGVuZ3RoID49IGxlbihzZWxmLmJ1ZmZlcik6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShsZW5ndGgpCisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlcltzZWxmLnBvaW50ZXI6c2VsZi5wb2ludGVyK2xlbmd0aF0KKworICAgIGRlZiBmb3J3YXJkKHNlbGYsIGxlbmd0aD0xKToKKyAgICAgICAgaWYgc2VsZi5wb2ludGVyK2xlbmd0aCsxID49IGxlbihzZWxmLmJ1ZmZlcik6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShsZW5ndGgrMSkKKyAgICAgICAgd2hpbGUgbGVuZ3RoOgorICAgICAgICAgICAgY2ggPSBzZWxmLmJ1ZmZlcltzZWxmLnBvaW50ZXJdCisgICAgICAgICAgICBzZWxmLnBvaW50ZXIgKz0gMQorICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICBpZiBjaCBpbiB1J1xuXHg4NVx1MjAyOFx1MjAyOScgIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgKGNoID09IHUnXHInIGFuZCBzZWxmLmJ1ZmZlcltzZWxmLnBvaW50ZXJdICE9IHUnXG4nKToKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmUgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uID0gMAorICAgICAgICAgICAgZWxpZiBjaCAhPSB1J1x1RkVGRic6CisgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gMQorICAgICAgICAgICAgbGVuZ3RoIC09IDEKKworICAgIGRlZiBnZXRfbWFyayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBNYXJrKHNlbGYubmFtZSwgc2VsZi5pbmRleCwgc2VsZi5saW5lLCBzZWxmLmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIsIHNlbGYucG9pbnRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBNYXJrKHNlbGYubmFtZSwgc2VsZi5pbmRleCwgc2VsZi5saW5lLCBzZWxmLmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSkKKworICAgIGRlZiBkZXRlcm1pbmVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmVvZiBhbmQgbGVuKHNlbGYucmF3X2J1ZmZlcikgPCAyOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfcmF3KCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5yYXdfYnVmZmVyLCB1bmljb2RlKToKKyAgICAgICAgICAgIGlmIHNlbGYucmF3X2J1ZmZlci5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGMTZfTEUpOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9ICd1dGYtMTYtbGUnCisgICAgICAgICAgICBlbGlmIHNlbGYucmF3X2J1ZmZlci5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGMTZfQkUpOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9ICd1dGYtMTYtYmUnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfOF9kZWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gJ3V0Zi04JworICAgICAgICBzZWxmLnVwZGF0ZSgxKQorCisgICAgTk9OX1BSSU5UQUJMRSA9IHJlLmNvbXBpbGUodSdbXlx4MDlceDBBXHgwRFx4MjAtXHg3RVx4ODVceEEwLVx1RDdGRlx1RTAwMC1cdUZGRkRdJykKKyAgICBkZWYgY2hlY2tfcHJpbnRhYmxlKHNlbGYsIGRhdGEpOgorICAgICAgICBtYXRjaCA9IHNlbGYuTk9OX1BSSU5UQUJMRS5zZWFyY2goZGF0YSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBtYXRjaC5ncm91cCgpCisgICAgICAgICAgICBwb3NpdGlvbiA9IHNlbGYuaW5kZXgrKGxlbihzZWxmLmJ1ZmZlciktc2VsZi5wb2ludGVyKSttYXRjaC5zdGFydCgpCisgICAgICAgICAgICByYWlzZSBSZWFkZXJFcnJvcihzZWxmLm5hbWUsIHBvc2l0aW9uLCBvcmQoY2hhcmFjdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGUnLCAic3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCIpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIGlmIHNlbGYucmF3X2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2VsZi5wb2ludGVyOl0KKyAgICAgICAgc2VsZi5wb2ludGVyID0gMAorICAgICAgICB3aGlsZSBsZW4oc2VsZi5idWZmZXIpIDwgbGVuZ3RoOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX3JhdygpCisgICAgICAgICAgICBpZiBzZWxmLnJhd19kZWNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhLCBjb252ZXJ0ZWQgPSBzZWxmLnJhd19kZWNvZGUoc2VsZi5yYXdfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpY3QnLCBzZWxmLmVvZikKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yLCBleGM6CisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IGV4Yy5vYmplY3RbZXhjLnN0YXJ0XQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5zdHJlYW1fcG9pbnRlci1sZW4oc2VsZi5yYXdfYnVmZmVyKStleGMuc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gZXhjLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRlckVycm9yKHNlbGYubmFtZSwgcG9zaXRpb24sIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZW5jb2RpbmcsIGV4Yy5yZWFzb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJhd19idWZmZXIKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBsZW4oZGF0YSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcHJpbnRhYmxlKGRhdGEpCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhCisgICAgICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBzZWxmLnJhd19idWZmZXJbY29udmVydGVkOl0KKyAgICAgICAgICAgIGlmIHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9IHUnXDAnCisgICAgICAgICAgICAgICAgc2VsZi5yYXdfYnVmZmVyID0gTm9uZQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgdXBkYXRlX3JhdyhzZWxmLCBzaXplPTEwMjQpOgorICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0ucmVhZChzaXplKQorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgc2VsZi5yYXdfYnVmZmVyICs9IGRhdGEKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtX3BvaW50ZXIgKz0gbGVuKGRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVvZiA9IFRydWUKKworI3RyeToKKyMgICAgaW1wb3J0IHBzeWNvCisjICAgIHBzeWNvLmJpbmQoUmVhZGVyKQorI2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyMgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIveWFtbC9yZXByZXNlbnRlci5weSBiL2xpYi95YW1sL3JlcHJlc2VudGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGZjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveWFtbC9yZXByZXNlbnRlci5weQpAQCAtMCwwICsxLDQ4NCBAQAorCitfX2FsbF9fID0gWydCYXNlUmVwcmVzZW50ZXInLCAnU2FmZVJlcHJlc2VudGVyJywgJ1JlcHJlc2VudGVyJywKKyAgICAnUmVwcmVzZW50ZXJFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0ICoKK2Zyb20gbm9kZXMgaW1wb3J0ICoKKworaW1wb3J0IGRhdGV0aW1lCisKK2ltcG9ydCBzeXMsIGNvcHlfcmVnLCB0eXBlcworCitjbGFzcyBSZXByZXNlbnRlckVycm9yKFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBCYXNlUmVwcmVzZW50ZXIob2JqZWN0KToKKworICAgIHlhbWxfcmVwcmVzZW50ZXJzID0ge30KKyAgICB5YW1sX211bHRpX3JlcHJlc2VudGVycyA9IHt9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIHNlbGYuZGVmYXVsdF9zdHlsZSA9IGRlZmF1bHRfc3R5bGUKKyAgICAgICAgc2VsZi5kZWZhdWx0X2Zsb3dfc3R5bGUgPSBkZWZhdWx0X2Zsb3dfc3R5bGUKKyAgICAgICAgc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzID0ge30KKyAgICAgICAgc2VsZi5vYmplY3Rfa2VlcGVyID0gW10KKyAgICAgICAgc2VsZi5hbGlhc19rZXkgPSBOb25lCisKKyAgICBkZWYgcmVwcmVzZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBub2RlID0gc2VsZi5yZXByZXNlbnRfZGF0YShkYXRhKQorICAgICAgICBzZWxmLnNlcmlhbGl6ZShub2RlKQorICAgICAgICBzZWxmLnJlcHJlc2VudGVkX29iamVjdHMgPSB7fQorICAgICAgICBzZWxmLm9iamVjdF9rZWVwZXIgPSBbXQorICAgICAgICBzZWxmLmFsaWFzX2tleSA9IE5vbmUKKworICAgIGRlZiBnZXRfY2xhc3NvYmpfYmFzZXMoc2VsZiwgY2xzKToKKyAgICAgICAgYmFzZXMgPSBbY2xzXQorICAgICAgICBmb3IgYmFzZSBpbiBjbHMuX19iYXNlc19fOgorICAgICAgICAgICAgYmFzZXMuZXh0ZW5kKHNlbGYuZ2V0X2NsYXNzb2JqX2Jhc2VzKGJhc2UpKQorICAgICAgICByZXR1cm4gYmFzZXMKKworICAgIGRlZiByZXByZXNlbnRfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5pZ25vcmVfYWxpYXNlcyhkYXRhKToKKyAgICAgICAgICAgIHNlbGYuYWxpYXNfa2V5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hbGlhc19rZXkgPSBpZChkYXRhKQorICAgICAgICBpZiBzZWxmLmFsaWFzX2tleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuYWxpYXNfa2V5IGluIHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0czoKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzW3NlbGYuYWxpYXNfa2V5XQorICAgICAgICAgICAgICAgICNpZiBub2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyAgICByYWlzZSBSZXByZXNlbnRlckVycm9yKCJyZWN1cnNpdmUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQ6ICVyIiAlIGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgICAgICNzZWxmLnJlcHJlc2VudGVkX29iamVjdHNbYWxpYXNfa2V5XSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYub2JqZWN0X2tlZXBlci5hcHBlbmQoZGF0YSkKKyAgICAgICAgZGF0YV90eXBlcyA9IHR5cGUoZGF0YSkuX19tcm9fXworICAgICAgICBpZiB0eXBlKGRhdGEpIGlzIHR5cGVzLkluc3RhbmNlVHlwZToKKyAgICAgICAgICAgIGRhdGFfdHlwZXMgPSBzZWxmLmdldF9jbGFzc29ial9iYXNlcyhkYXRhLl9fY2xhc3NfXykrbGlzdChkYXRhX3R5cGVzKQorICAgICAgICBpZiBkYXRhX3R5cGVzWzBdIGluIHNlbGYueWFtbF9yZXByZXNlbnRlcnM6CisgICAgICAgICAgICBub2RlID0gc2VsZi55YW1sX3JlcHJlc2VudGVyc1tkYXRhX3R5cGVzWzBdXShzZWxmLCBkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGRhdGFfdHlwZSBpbiBkYXRhX3R5cGVzOgorICAgICAgICAgICAgICAgIGlmIGRhdGFfdHlwZSBpbiBzZWxmLnlhbWxfbXVsdGlfcmVwcmVzZW50ZXJzOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi55YW1sX211bHRpX3JlcHJlc2VudGVyc1tkYXRhX3R5cGVdKHNlbGYsIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIE5vbmUgaW4gc2VsZi55YW1sX211bHRpX3JlcHJlc2VudGVyczoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYueWFtbF9tdWx0aV9yZXByZXNlbnRlcnNbTm9uZV0oc2VsZiwgZGF0YSkKKyAgICAgICAgICAgICAgICBlbGlmIE5vbmUgaW4gc2VsZi55YW1sX3JlcHJlc2VudGVyczoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYueWFtbF9yZXByZXNlbnRlcnNbTm9uZV0oc2VsZiwgZGF0YSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gU2NhbGFyTm9kZShOb25lLCB1bmljb2RlKGRhdGEpKQorICAgICAgICAjaWYgYWxpYXNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAjICAgIHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0c1thbGlhc19rZXldID0gbm9kZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGFkZF9yZXByZXNlbnRlcihjbHMsIGRhdGFfdHlwZSwgcmVwcmVzZW50ZXIpOgorICAgICAgICBpZiBub3QgJ3lhbWxfcmVwcmVzZW50ZXJzJyBpbiBjbHMuX19kaWN0X186CisgICAgICAgICAgICBjbHMueWFtbF9yZXByZXNlbnRlcnMgPSBjbHMueWFtbF9yZXByZXNlbnRlcnMuY29weSgpCisgICAgICAgIGNscy55YW1sX3JlcHJlc2VudGVyc1tkYXRhX3R5cGVdID0gcmVwcmVzZW50ZXIKKyAgICBhZGRfcmVwcmVzZW50ZXIgPSBjbGFzc21ldGhvZChhZGRfcmVwcmVzZW50ZXIpCisKKyAgICBkZWYgYWRkX211bHRpX3JlcHJlc2VudGVyKGNscywgZGF0YV90eXBlLCByZXByZXNlbnRlcik6CisgICAgICAgIGlmIG5vdCAneWFtbF9tdWx0aV9yZXByZXNlbnRlcnMnIGluIGNscy5fX2RpY3RfXzoKKyAgICAgICAgICAgIGNscy55YW1sX211bHRpX3JlcHJlc2VudGVycyA9IGNscy55YW1sX211bHRpX3JlcHJlc2VudGVycy5jb3B5KCkKKyAgICAgICAgY2xzLnlhbWxfbXVsdGlfcmVwcmVzZW50ZXJzW2RhdGFfdHlwZV0gPSByZXByZXNlbnRlcgorICAgIGFkZF9tdWx0aV9yZXByZXNlbnRlciA9IGNsYXNzbWV0aG9kKGFkZF9tdWx0aV9yZXByZXNlbnRlcikKKworICAgIGRlZiByZXByZXNlbnRfc2NhbGFyKHNlbGYsIHRhZywgdmFsdWUsIHN0eWxlPU5vbmUpOgorICAgICAgICBpZiBzdHlsZSBpcyBOb25lOgorICAgICAgICAgICAgc3R5bGUgPSBzZWxmLmRlZmF1bHRfc3R5bGUKKyAgICAgICAgbm9kZSA9IFNjYWxhck5vZGUodGFnLCB2YWx1ZSwgc3R5bGU9c3R5bGUpCisgICAgICAgIGlmIHNlbGYuYWxpYXNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzW3NlbGYuYWxpYXNfa2V5XSA9IG5vZGUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiByZXByZXNlbnRfc2VxdWVuY2Uoc2VsZiwgdGFnLCBzZXF1ZW5jZSwgZmxvd19zdHlsZT1Ob25lKToKKyAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICBub2RlID0gU2VxdWVuY2VOb2RlKHRhZywgdmFsdWUsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKyAgICAgICAgaWYgc2VsZi5hbGlhc19rZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlcHJlc2VudGVkX29iamVjdHNbc2VsZi5hbGlhc19rZXldID0gbm9kZQorICAgICAgICBiZXN0X3N0eWxlID0gVHJ1ZQorICAgICAgICBmb3IgaXRlbSBpbiBzZXF1ZW5jZToKKyAgICAgICAgICAgIG5vZGVfaXRlbSA9IHNlbGYucmVwcmVzZW50X2RhdGEoaXRlbSkKKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShub2RlX2l0ZW0sIFNjYWxhck5vZGUpIGFuZCBub3Qgbm9kZV9pdGVtLnN0eWxlKToKKyAgICAgICAgICAgICAgICBiZXN0X3N0eWxlID0gRmFsc2UKKyAgICAgICAgICAgIHZhbHVlLmFwcGVuZChub2RlX2l0ZW0pCisgICAgICAgIGlmIGZsb3dfc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IGJlc3Rfc3R5bGUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiByZXByZXNlbnRfbWFwcGluZyhzZWxmLCB0YWcsIG1hcHBpbmcsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgbm9kZSA9IE1hcHBpbmdOb2RlKHRhZywgdmFsdWUsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKyAgICAgICAgaWYgc2VsZi5hbGlhc19rZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlcHJlc2VudGVkX29iamVjdHNbc2VsZi5hbGlhc19rZXldID0gbm9kZQorICAgICAgICBiZXN0X3N0eWxlID0gVHJ1ZQorICAgICAgICBpZiBoYXNhdHRyKG1hcHBpbmcsICdpdGVtcycpOgorICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmcuaXRlbXMoKQorICAgICAgICAgICAgbWFwcGluZy5zb3J0KCkKKyAgICAgICAgZm9yIGl0ZW1fa2V5LCBpdGVtX3ZhbHVlIGluIG1hcHBpbmc6CisgICAgICAgICAgICBub2RlX2tleSA9IHNlbGYucmVwcmVzZW50X2RhdGEoaXRlbV9rZXkpCisgICAgICAgICAgICBub2RlX3ZhbHVlID0gc2VsZi5yZXByZXNlbnRfZGF0YShpdGVtX3ZhbHVlKQorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKG5vZGVfa2V5LCBTY2FsYXJOb2RlKSBhbmQgbm90IG5vZGVfa2V5LnN0eWxlKToKKyAgICAgICAgICAgICAgICBiZXN0X3N0eWxlID0gRmFsc2UKKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShub2RlX3ZhbHVlLCBTY2FsYXJOb2RlKSBhbmQgbm90IG5vZGVfdmFsdWUuc3R5bGUpOgorICAgICAgICAgICAgICAgIGJlc3Rfc3R5bGUgPSBGYWxzZQorICAgICAgICAgICAgdmFsdWUuYXBwZW5kKChub2RlX2tleSwgbm9kZV92YWx1ZSkpCisgICAgICAgIGlmIGZsb3dfc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IGJlc3Rfc3R5bGUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBpZ25vcmVfYWxpYXNlcyhzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIFNhZmVSZXByZXNlbnRlcihCYXNlUmVwcmVzZW50ZXIpOgorCisgICAgZGVmIGlnbm9yZV9hbGlhc2VzKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBkYXRhIGluIFtOb25lLCAoKV06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIChzdHIsIHVuaWNvZGUsIGJvb2wsIGludCwgZmxvYXQpKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVwcmVzZW50X25vbmUoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIodSd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywKKyAgICAgICAgICAgICAgICB1J251bGwnKQorCisgICAgZGVmIHJlcHJlc2VudF9zdHIoc2VsZiwgZGF0YSk6CisgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgc3R5bGUgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSB1bmljb2RlKGRhdGEsICdhc2NpaScpCisgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnN0cicKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRhID0gdW5pY29kZShkYXRhLCAndXRmLTgnKQorICAgICAgICAgICAgICAgIHRhZyA9IHUndGFnOnlhbWwub3JnLDIwMDI6c3RyJworICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoJ2Jhc2U2NCcpCisgICAgICAgICAgICAgICAgdGFnID0gdSd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknCisgICAgICAgICAgICAgICAgc3R5bGUgPSAnfCcKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NjYWxhcih0YWcsIGRhdGEsIHN0eWxlPXN0eWxlKQorCisgICAgZGVmIHJlcHJlc2VudF91bmljb2RlKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHUndGFnOnlhbWwub3JnLDIwMDI6c3RyJywgZGF0YSkKKworICAgIGRlZiByZXByZXNlbnRfYm9vbChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHZhbHVlID0gdSd0cnVlJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSB1J2ZhbHNlJworICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHUndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsIHZhbHVlKQorCisgICAgZGVmIHJlcHJlc2VudF9pbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIodSd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCB1bmljb2RlKGRhdGEpKQorCisgICAgZGVmIHJlcHJlc2VudF9sb25nKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHUndGFnOnlhbWwub3JnLDIwMDI6aW50JywgdW5pY29kZShkYXRhKSkKKworICAgIGluZl92YWx1ZSA9IDFlMzAwCisgICAgd2hpbGUgcmVwcihpbmZfdmFsdWUpICE9IHJlcHIoaW5mX3ZhbHVlKmluZl92YWx1ZSk6CisgICAgICAgIGluZl92YWx1ZSAqPSBpbmZfdmFsdWUKKworICAgIGRlZiByZXByZXNlbnRfZmxvYXQoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGRhdGEgIT0gZGF0YSBvciAoZGF0YSA9PSAwLjAgYW5kIGRhdGEgPT0gMS4wKToKKyAgICAgICAgICAgIHZhbHVlID0gdScubmFuJworICAgICAgICBlbGlmIGRhdGEgPT0gc2VsZi5pbmZfdmFsdWU6CisgICAgICAgICAgICB2YWx1ZSA9IHUnLmluZicKKyAgICAgICAgZWxpZiBkYXRhID09IC1zZWxmLmluZl92YWx1ZToKKyAgICAgICAgICAgIHZhbHVlID0gdSctLmluZicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gdW5pY29kZShyZXByKGRhdGEpKS5sb3dlcigpCisgICAgICAgICAgICAjIE5vdGUgdGhhdCBpbiBzb21lIGNhc2VzIGByZXByKGRhdGEpYCByZXByZXNlbnRzIGEgZmxvYXQgbnVtYmVyCisgICAgICAgICAgICAjIHdpdGhvdXQgdGhlIGRlY2ltYWwgcGFydHMuICBGb3IgaW5zdGFuY2U6CisgICAgICAgICAgICAjICAgPj4+IHJlcHIoMWUxNykKKyAgICAgICAgICAgICMgICAnMWUxNycKKyAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBub3QgYSB2YWxpZCBmbG9hdCByZXByZXNlbnRhdGlvbiBhY2NvcmRpbmcKKyAgICAgICAgICAgICMgdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGAhIWZsb2F0YCB0YWcuICBXZSBmaXggdGhpcyBieSBhZGRpbmcKKyAgICAgICAgICAgICMgJy4wJyBiZWZvcmUgdGhlICdlJyBzeW1ib2wuCisgICAgICAgICAgICBpZiB1Jy4nIG5vdCBpbiB2YWx1ZSBhbmQgdSdlJyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UodSdlJywgdScuMGUnLCAxKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHUndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfbGlzdChzZWxmLCBkYXRhKToKKyAgICAgICAgI3BhaXJzID0gKGxlbihkYXRhKSA+IDAgYW5kIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCkpCisgICAgICAgICNpZiBwYWlyczoKKyAgICAgICAgIyAgICBmb3IgaXRlbSBpbiBkYXRhOgorICAgICAgICAjICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCB0dXBsZSkgb3IgbGVuKGl0ZW0pICE9IDI6CisgICAgICAgICMgICAgICAgICAgICBwYWlycyA9IEZhbHNlCisgICAgICAgICMgICAgICAgICAgICBicmVhaworICAgICAgICAjaWYgbm90IHBhaXJzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NlcXVlbmNlKHUndGFnOnlhbWwub3JnLDIwMDI6c2VxJywgZGF0YSkKKyAgICAgICAgI3ZhbHVlID0gW10KKyAgICAgICAgI2ZvciBpdGVtX2tleSwgaXRlbV92YWx1ZSBpbiBkYXRhOgorICAgICAgICAjICAgIHZhbHVlLmFwcGVuZChzZWxmLnJlcHJlc2VudF9tYXBwaW5nKHUndGFnOnlhbWwub3JnLDIwMDI6bWFwJywKKyAgICAgICAgIyAgICAgICAgWyhpdGVtX2tleSwgaXRlbV92YWx1ZSldKSkKKyAgICAgICAgI3JldHVybiBTZXF1ZW5jZU5vZGUodSd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsIHZhbHVlKQorCisgICAgZGVmIHJlcHJlc2VudF9kaWN0KHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfbWFwcGluZyh1J3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X3NldChzZWxmLCBkYXRhKToKKyAgICAgICAgdmFsdWUgPSB7fQorICAgICAgICBmb3Iga2V5IGluIGRhdGE6CisgICAgICAgICAgICB2YWx1ZVtrZXldID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfbWFwcGluZyh1J3RhZzp5YW1sLm9yZywyMDAyOnNldCcsIHZhbHVlKQorCisgICAgZGVmIHJlcHJlc2VudF9kYXRlKHNlbGYsIGRhdGEpOgorICAgICAgICB2YWx1ZSA9IHVuaWNvZGUoZGF0YS5pc29mb3JtYXQoKSkKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NjYWxhcih1J3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsIHZhbHVlKQorCisgICAgZGVmIHJlcHJlc2VudF9kYXRldGltZShzZWxmLCBkYXRhKToKKyAgICAgICAgdmFsdWUgPSB1bmljb2RlKGRhdGEuaXNvZm9ybWF0KCcgJykpCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIodSd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfeWFtbF9vYmplY3Qoc2VsZiwgdGFnLCBkYXRhLCBjbHMsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIGlmIGhhc2F0dHIoZGF0YSwgJ19fZ2V0c3RhdGVfXycpOgorICAgICAgICAgICAgc3RhdGUgPSBkYXRhLl9fZ2V0c3RhdGVfXygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0ZSA9IGRhdGEuX19kaWN0X18uY29weSgpCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9tYXBwaW5nKHRhZywgc3RhdGUsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKworICAgIGRlZiByZXByZXNlbnRfdW5kZWZpbmVkKHNlbGYsIGRhdGEpOgorICAgICAgICByYWlzZSBSZXByZXNlbnRlckVycm9yKCJjYW5ub3QgcmVwcmVzZW50IGFuIG9iamVjdDogJXMiICUgZGF0YSkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcih0eXBlKE5vbmUpLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X25vbmUpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoc3RyLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X3N0cikKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcih1bmljb2RlLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X3VuaWNvZGUpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoYm9vbCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9ib29sKQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGludCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9pbnQpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIobG9uZywKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9sb25nKQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGZsb2F0LAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X2Zsb2F0KQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGxpc3QsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfbGlzdCkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcih0dXBsZSwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9saXN0KQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGRpY3QsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfZGljdCkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcihzZXQsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfc2V0KQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGRhdGV0aW1lLmRhdGUsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfZGF0ZSkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcihkYXRldGltZS5kYXRldGltZSwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9kYXRldGltZSkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcihOb25lLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X3VuZGVmaW5lZCkKKworY2xhc3MgUmVwcmVzZW50ZXIoU2FmZVJlcHJlc2VudGVyKToKKworICAgIGRlZiByZXByZXNlbnRfc3RyKHNlbGYsIGRhdGEpOgorICAgICAgICB0YWcgPSBOb25lCisgICAgICAgIHN0eWxlID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gdW5pY29kZShkYXRhLCAnYXNjaWknKQorICAgICAgICAgICAgdGFnID0gdSd0YWc6eWFtbC5vcmcsMjAwMjpzdHInCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IHVuaWNvZGUoZGF0YSwgJ3V0Zi04JykKKyAgICAgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9zdHInCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgnYmFzZTY0JykKKyAgICAgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScKKyAgICAgICAgICAgICAgICBzdHlsZSA9ICd8JworICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHRhZywgZGF0YSwgc3R5bGU9c3R5bGUpCisKKyAgICBkZWYgcmVwcmVzZW50X3VuaWNvZGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgIHRhZyA9IHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL3VuaWNvZGUnCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnN0cicKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NjYWxhcih0YWcsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X2xvbmcoc2VsZiwgZGF0YSk6CisgICAgICAgIHRhZyA9IHUndGFnOnlhbWwub3JnLDIwMDI6aW50JworICAgICAgICBpZiBpbnQoZGF0YSkgaXMgbm90IGRhdGE6CisgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9sb25nJworICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHRhZywgdW5pY29kZShkYXRhKSkKKworICAgIGRlZiByZXByZXNlbnRfY29tcGxleChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgZGF0YS5pbWFnID09IDAuMDoKKyAgICAgICAgICAgIGRhdGEgPSB1JyVyJyAlIGRhdGEucmVhbAorICAgICAgICBlbGlmIGRhdGEucmVhbCA9PSAwLjA6CisgICAgICAgICAgICBkYXRhID0gdSclcmonICUgZGF0YS5pbWFnCisgICAgICAgIGVsaWYgZGF0YS5pbWFnID4gMDoKKyAgICAgICAgICAgIGRhdGEgPSB1JyVyKyVyaicgJSAoZGF0YS5yZWFsLCBkYXRhLmltYWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gdSclciVyaicgJSAoZGF0YS5yZWFsLCBkYXRhLmltYWcpCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIodSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vY29tcGxleCcsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X3R1cGxlKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2VxdWVuY2UodSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vdHVwbGUnLCBkYXRhKQorCisgICAgZGVmIHJlcHJlc2VudF9uYW1lKHNlbGYsIGRhdGEpOgorICAgICAgICBuYW1lID0gdSclcy4lcycgJSAoZGF0YS5fX21vZHVsZV9fLCBkYXRhLl9fbmFtZV9fKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL25hbWU6JytuYW1lLCB1JycpCisKKyAgICBkZWYgcmVwcmVzZW50X21vZHVsZShzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NjYWxhcigKKyAgICAgICAgICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9tb2R1bGU6JytkYXRhLl9fbmFtZV9fLCB1JycpCisKKyAgICBkZWYgcmVwcmVzZW50X2luc3RhbmNlKHNlbGYsIGRhdGEpOgorICAgICAgICAjIEZvciBpbnN0YW5jZXMgb2YgY2xhc3NpYyBjbGFzc2VzLCB3ZSB1c2UgX19nZXRpbml0YXJnc19fIGFuZAorICAgICAgICAjIF9fZ2V0c3RhdGVfXyB0byBzZXJpYWxpemUgdGhlIGRhdGEuCisKKyAgICAgICAgIyBJZiBkYXRhLl9fZ2V0aW5pdGFyZ3NfXyBleGlzdHMsIHRoZSBvYmplY3QgbXVzdCBiZSByZWNvbnN0cnVjdGVkIGJ5CisgICAgICAgICMgY2FsbGluZyBjbHMoKiphcmdzKSwgd2hlcmUgYXJncyBpcyBhIHR1cGxlIHJldHVybmVkIGJ5CisgICAgICAgICMgX19nZXRpbml0YXJnc19fLiBPdGhlcndpc2UsIHRoZSBjbHMuX19pbml0X18gbWV0aG9kIHNob3VsZCBuZXZlciBiZQorICAgICAgICAjIGNhbGxlZCBhbmQgdGhlIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyBhIHRyaXZpYWwKKyAgICAgICAgIyBjbGFzcyBhbmQgYXNzaWduaW5nIHRvIHRoZSBpbnN0YW5jZSdzIF9fY2xhc3NfXyB2YXJpYWJsZS4KKworICAgICAgICAjIElmIGRhdGEuX19nZXRzdGF0ZV9fIGV4aXN0cywgaXQgcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgIyBPdGhlcndpc2UsIHRoZSBzdGF0ZSBvZiB0aGUgb2JqZWN0IGlzIGRhdGEuX19kaWN0X18uCisKKyAgICAgICAgIyBXZSBwcm9kdWNlIGVpdGhlciBhICEhcHl0aG9uL29iamVjdCBvciAhIXB5dGhvbi9vYmplY3QvbmV3IG5vZGUuCisgICAgICAgICMgSWYgZGF0YS5fX2dldGluaXRhcmdzX18gZG9lcyBub3QgZXhpc3QgYW5kIHN0YXRlIGlzIGEgZGljdGlvbmFyeSwgd2UKKyAgICAgICAgIyBwcm9kdWNlIGEgISFweXRob24vb2JqZWN0IG5vZGUgLiBPdGhlcndpc2Ugd2UgcHJvZHVjZSBhCisgICAgICAgICMgISFweXRob24vb2JqZWN0L25ldyBub2RlLgorCisgICAgICAgIGNscyA9IGRhdGEuX19jbGFzc19fCisgICAgICAgIGNsYXNzX25hbWUgPSB1JyVzLiVzJyAlIChjbHMuX19tb2R1bGVfXywgY2xzLl9fbmFtZV9fKQorICAgICAgICBhcmdzID0gTm9uZQorICAgICAgICBzdGF0ZSA9IE5vbmUKKyAgICAgICAgaWYgaGFzYXR0cihkYXRhLCAnX19nZXRpbml0YXJnc19fJyk6CisgICAgICAgICAgICBhcmdzID0gbGlzdChkYXRhLl9fZ2V0aW5pdGFyZ3NfXygpKQorICAgICAgICBpZiBoYXNhdHRyKGRhdGEsICdfX2dldHN0YXRlX18nKToKKyAgICAgICAgICAgIHN0YXRlID0gZGF0YS5fX2dldHN0YXRlX18oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdGUgPSBkYXRhLl9fZGljdF9fCisgICAgICAgIGlmIGFyZ3MgaXMgTm9uZSBhbmQgaXNpbnN0YW5jZShzdGF0ZSwgZGljdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfbWFwcGluZygKKyAgICAgICAgICAgICAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vb2JqZWN0OicrY2xhc3NfbmFtZSwgc3RhdGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIGRpY3QpIGFuZCBub3Qgc3RhdGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdC9uZXc6JytjbGFzc19uYW1lLCBhcmdzKQorICAgICAgICB2YWx1ZSA9IHt9CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICB2YWx1ZVsnYXJncyddID0gYXJncworICAgICAgICB2YWx1ZVsnc3RhdGUnXSA9IHN0YXRlCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9tYXBwaW5nKAorICAgICAgICAgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdC9uZXc6JytjbGFzc19uYW1lLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfb2JqZWN0KHNlbGYsIGRhdGEpOgorICAgICAgICAjIFdlIHVzZSBfX3JlZHVjZV9fIEFQSSB0byBzYXZlIHRoZSBkYXRhLiBkYXRhLl9fcmVkdWNlX18gcmV0dXJucworICAgICAgICAjIGEgdHVwbGUgb2YgbGVuZ3RoIDItNToKKyAgICAgICAgIyAgIChmdW5jdGlvbiwgYXJncywgc3RhdGUsIGxpc3RpdGVtcywgZGljdGl0ZW1zKQorCisgICAgICAgICMgRm9yIHJlY29uc3RydWN0aW5nLCB3ZSBjYWxscyBmdW5jdGlvbigqYXJncyksIHRoZW4gc2V0IGl0cyBzdGF0ZSwKKyAgICAgICAgIyBsaXN0aXRlbXMsIGFuZCBkaWN0aXRlbXMgaWYgdGhleSBhcmUgbm90IE5vbmUuCisKKyAgICAgICAgIyBBIHNwZWNpYWwgY2FzZSBpcyB3aGVuIGZ1bmN0aW9uLl9fbmFtZV9fID09ICdfX25ld29ial9fJy4gSW4gdGhpcworICAgICAgICAjIGNhc2Ugd2UgY3JlYXRlIHRoZSBvYmplY3Qgd2l0aCBhcmdzWzBdLl9fbmV3X18oKmFyZ3MpLgorCisgICAgICAgICMgQW5vdGhlciBzcGVjaWFsIGNhc2UgaXMgd2hlbiBfX3JlZHVjZV9fIHJldHVybnMgYSBzdHJpbmcgLSB3ZSBkb24ndAorICAgICAgICAjIHN1cHBvcnQgaXQuCisKKyAgICAgICAgIyBXZSBwcm9kdWNlIGEgISFweXRob24vb2JqZWN0LCAhIXB5dGhvbi9vYmplY3QvbmV3IG9yCisgICAgICAgICMgISFweXRob24vb2JqZWN0L2FwcGx5IG5vZGUuCisKKyAgICAgICAgY2xzID0gdHlwZShkYXRhKQorICAgICAgICBpZiBjbHMgaW4gY29weV9yZWcuZGlzcGF0Y2hfdGFibGU6CisgICAgICAgICAgICByZWR1Y2UgPSBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZVtjbHNdKGRhdGEpCisgICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAnX19yZWR1Y2VfZXhfXycpOgorICAgICAgICAgICAgcmVkdWNlID0gZGF0YS5fX3JlZHVjZV9leF9fKDIpCisgICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAnX19yZWR1Y2VfXycpOgorICAgICAgICAgICAgcmVkdWNlID0gZGF0YS5fX3JlZHVjZV9fKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJlcHJlc2VudGVyRXJyb3IoImNhbm5vdCByZXByZXNlbnQgb2JqZWN0OiAlciIgJSBkYXRhKQorICAgICAgICByZWR1Y2UgPSAobGlzdChyZWR1Y2UpK1tOb25lXSo1KVs6NV0KKyAgICAgICAgZnVuY3Rpb24sIGFyZ3MsIHN0YXRlLCBsaXN0aXRlbXMsIGRpY3RpdGVtcyA9IHJlZHVjZQorICAgICAgICBhcmdzID0gbGlzdChhcmdzKQorICAgICAgICBpZiBzdGF0ZSBpcyBOb25lOgorICAgICAgICAgICAgc3RhdGUgPSB7fQorICAgICAgICBpZiBsaXN0aXRlbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaXN0aXRlbXMgPSBsaXN0KGxpc3RpdGVtcykKKyAgICAgICAgaWYgZGljdGl0ZW1zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGljdGl0ZW1zID0gZGljdChkaWN0aXRlbXMpCisgICAgICAgIGlmIGZ1bmN0aW9uLl9fbmFtZV9fID09ICdfX25ld29ial9fJzoKKyAgICAgICAgICAgIGZ1bmN0aW9uID0gYXJnc1swXQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgICAgICB0YWcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9vYmplY3QvbmV3OicKKyAgICAgICAgICAgIG5ld29iaiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhZyA9IHUndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdC9hcHBseTonCisgICAgICAgICAgICBuZXdvYmogPSBGYWxzZQorICAgICAgICBmdW5jdGlvbl9uYW1lID0gdSclcy4lcycgJSAoZnVuY3Rpb24uX19tb2R1bGVfXywgZnVuY3Rpb24uX19uYW1lX18pCisgICAgICAgIGlmIG5vdCBhcmdzIGFuZCBub3QgbGlzdGl0ZW1zIGFuZCBub3QgZGljdGl0ZW1zIFwKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzdGF0ZSwgZGljdCkgYW5kIG5ld29iajoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9tYXBwaW5nKAorICAgICAgICAgICAgICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9vYmplY3Q6JytmdW5jdGlvbl9uYW1lLCBzdGF0ZSkKKyAgICAgICAgaWYgbm90IGxpc3RpdGVtcyBhbmQgbm90IGRpY3RpdGVtcyAgXAorICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHN0YXRlLCBkaWN0KSBhbmQgbm90IHN0YXRlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NlcXVlbmNlKHRhZytmdW5jdGlvbl9uYW1lLCBhcmdzKQorICAgICAgICB2YWx1ZSA9IHt9CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICB2YWx1ZVsnYXJncyddID0gYXJncworICAgICAgICBpZiBzdGF0ZSBvciBub3QgaXNpbnN0YW5jZShzdGF0ZSwgZGljdCk6CisgICAgICAgICAgICB2YWx1ZVsnc3RhdGUnXSA9IHN0YXRlCisgICAgICAgIGlmIGxpc3RpdGVtczoKKyAgICAgICAgICAgIHZhbHVlWydsaXN0aXRlbXMnXSA9IGxpc3RpdGVtcworICAgICAgICBpZiBkaWN0aXRlbXM6CisgICAgICAgICAgICB2YWx1ZVsnZGljdGl0ZW1zJ10gPSBkaWN0aXRlbXMKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X21hcHBpbmcodGFnK2Z1bmN0aW9uX25hbWUsIHZhbHVlKQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoc3RyLAorICAgICAgICBSZXByZXNlbnRlci5yZXByZXNlbnRfc3RyKQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodW5pY29kZSwKKyAgICAgICAgUmVwcmVzZW50ZXIucmVwcmVzZW50X3VuaWNvZGUpCisKK1JlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcihsb25nLAorICAgICAgICBSZXByZXNlbnRlci5yZXByZXNlbnRfbG9uZykKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGNvbXBsZXgsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9jb21wbGV4KQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodHVwbGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF90dXBsZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR5cGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9uYW1lKQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodHlwZXMuQ2xhc3NUeXBlLAorICAgICAgICBSZXByZXNlbnRlci5yZXByZXNlbnRfbmFtZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR5cGVzLkZ1bmN0aW9uVHlwZSwKKyAgICAgICAgUmVwcmVzZW50ZXIucmVwcmVzZW50X25hbWUpCisKK1JlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcih0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlLAorICAgICAgICBSZXByZXNlbnRlci5yZXByZXNlbnRfbmFtZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR5cGVzLk1vZHVsZVR5cGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9tb2R1bGUpCisKK1JlcHJlc2VudGVyLmFkZF9tdWx0aV9yZXByZXNlbnRlcih0eXBlcy5JbnN0YW5jZVR5cGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9pbnN0YW5jZSkKKworUmVwcmVzZW50ZXIuYWRkX211bHRpX3JlcHJlc2VudGVyKG9iamVjdCwKKyAgICAgICAgUmVwcmVzZW50ZXIucmVwcmVzZW50X29iamVjdCkKKwpkaWZmIC0tZ2l0IGEvbGliL3lhbWwvcmVzb2x2ZXIucHkgYi9saWIveWFtbC9yZXNvbHZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVhYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvcmVzb2x2ZXIucHkKQEAgLTAsMCArMSwyMjQgQEAKKworX19hbGxfXyA9IFsnQmFzZVJlc29sdmVyJywgJ1Jlc29sdmVyJ10KKworZnJvbSBlcnJvciBpbXBvcnQgKgorZnJvbSBub2RlcyBpbXBvcnQgKgorCitpbXBvcnQgcmUKKworY2xhc3MgUmVzb2x2ZXJFcnJvcihZQU1MRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgQmFzZVJlc29sdmVyKG9iamVjdCk6CisKKyAgICBERUZBVUxUX1NDQUxBUl9UQUcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOnN0cicKKyAgICBERUZBVUxUX1NFUVVFTkNFX1RBRyA9IHUndGFnOnlhbWwub3JnLDIwMDI6c2VxJworICAgIERFRkFVTFRfTUFQUElOR19UQUcgPSB1J3RhZzp5YW1sLm9yZywyMDAyOm1hcCcKKworICAgIHlhbWxfaW1wbGljaXRfcmVzb2x2ZXJzID0ge30KKyAgICB5YW1sX3BhdGhfcmVzb2x2ZXJzID0ge30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXNvbHZlcl9leGFjdF9wYXRocyA9IFtdCisgICAgICAgIHNlbGYucmVzb2x2ZXJfcHJlZml4X3BhdGhzID0gW10KKworICAgIGRlZiBhZGRfaW1wbGljaXRfcmVzb2x2ZXIoY2xzLCB0YWcsIHJlZ2V4cCwgZmlyc3QpOgorICAgICAgICBpZiBub3QgJ3lhbWxfaW1wbGljaXRfcmVzb2x2ZXJzJyBpbiBjbHMuX19kaWN0X186CisgICAgICAgICAgICBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMgPSBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuY29weSgpCisgICAgICAgIGlmIGZpcnN0IGlzIE5vbmU6CisgICAgICAgICAgICBmaXJzdCA9IFtOb25lXQorICAgICAgICBmb3IgY2ggaW4gZmlyc3Q6CisgICAgICAgICAgICBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuc2V0ZGVmYXVsdChjaCwgW10pLmFwcGVuZCgodGFnLCByZWdleHApKQorICAgIGFkZF9pbXBsaWNpdF9yZXNvbHZlciA9IGNsYXNzbWV0aG9kKGFkZF9pbXBsaWNpdF9yZXNvbHZlcikKKworICAgIGRlZiBhZGRfcGF0aF9yZXNvbHZlcihjbHMsIHRhZywgcGF0aCwga2luZD1Ob25lKToKKyAgICAgICAgIyBOb3RlOiBgYWRkX3BhdGhfcmVzb2x2ZXJgIGlzIGV4cGVyaW1lbnRhbC4gIFRoZSBBUEkgY291bGQgYmUgY2hhbmdlZC4KKyAgICAgICAgIyBgbmV3X3BhdGhgIGlzIGEgcGF0dGVybiB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgcGF0aCBmcm9tIHRoZQorICAgICAgICAjIHJvb3QgdG8gdGhlIG5vZGUgdGhhdCBpcyBiZWluZyBjb25zaWRlcmVkLiAgYG5vZGVfcGF0aGAgZWxlbWVudHMgYXJlCisgICAgICAgICMgdHVwbGVzIGAobm9kZV9jaGVjaywgaW5kZXhfY2hlY2spYC4gIGBub2RlX2NoZWNrYCBpcyBhIG5vZGUgY2xhc3M6CisgICAgICAgICMgYFNjYWxhck5vZGVgLCBgU2VxdWVuY2VOb2RlYCwgYE1hcHBpbmdOb2RlYCBvciBgTm9uZWAuICBgTm9uZWAKKyAgICAgICAgIyBtYXRjaGVzIGFueSBraW5kIG9mIGEgbm9kZS4gIGBpbmRleF9jaGVja2AgY291bGQgYmUgYE5vbmVgLCBhIGJvb2xlYW4KKyAgICAgICAgIyB2YWx1ZSwgYSBzdHJpbmcgdmFsdWUsIG9yIGEgbnVtYmVyLiAgYE5vbmVgIGFuZCBgRmFsc2VgIG1hdGNoIGFnYWluc3QKKyAgICAgICAgIyBhbnkgX3ZhbHVlXyBvZiBzZXF1ZW5jZSBhbmQgbWFwcGluZyBub2Rlcy4gIGBUcnVlYCBtYXRjaGVzIGFnYWluc3QKKyAgICAgICAgIyBhbnkgX2tleV8gb2YgYSBtYXBwaW5nIG5vZGUuICBBIHN0cmluZyBgaW5kZXhfY2hlY2tgIG1hdGNoZXMgYWdhaW5zdAorICAgICAgICAjIGEgbWFwcGluZyB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2NhbGFyIGtleSB3aGljaCBjb250ZW50IGlzCisgICAgICAgICMgZXF1YWwgdG8gdGhlIGBpbmRleF9jaGVja2AgdmFsdWUuICBBbiBpbnRlZ2VyIGBpbmRleF9jaGVja2AgbWF0Y2hlcworICAgICAgICAjIGFnYWluc3QgYSBzZXF1ZW5jZSB2YWx1ZSB3aXRoIHRoZSBpbmRleCBlcXVhbCB0byBgaW5kZXhfY2hlY2tgLgorICAgICAgICBpZiBub3QgJ3lhbWxfcGF0aF9yZXNvbHZlcnMnIGluIGNscy5fX2RpY3RfXzoKKyAgICAgICAgICAgIGNscy55YW1sX3BhdGhfcmVzb2x2ZXJzID0gY2xzLnlhbWxfcGF0aF9yZXNvbHZlcnMuY29weSgpCisgICAgICAgIG5ld19wYXRoID0gW10KKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gcGF0aDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICAgICAgaWYgbGVuKGVsZW1lbnQpID09IDI6CisgICAgICAgICAgICAgICAgICAgIG5vZGVfY2hlY2ssIGluZGV4X2NoZWNrID0gZWxlbWVudAorICAgICAgICAgICAgICAgIGVsaWYgbGVuKGVsZW1lbnQpID09IDE6CisgICAgICAgICAgICAgICAgICAgIG5vZGVfY2hlY2sgPSBlbGVtZW50WzBdCisgICAgICAgICAgICAgICAgICAgIGluZGV4X2NoZWNrID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlc29sdmVyRXJyb3IoIkludmFsaWQgcGF0aCBlbGVtZW50OiAlcyIgJSBlbGVtZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub2RlX2NoZWNrID0gTm9uZQorICAgICAgICAgICAgICAgIGluZGV4X2NoZWNrID0gZWxlbWVudAorICAgICAgICAgICAgaWYgbm9kZV9jaGVjayBpcyBzdHI6CisgICAgICAgICAgICAgICAgbm9kZV9jaGVjayA9IFNjYWxhck5vZGUKKyAgICAgICAgICAgIGVsaWYgbm9kZV9jaGVjayBpcyBsaXN0OgorICAgICAgICAgICAgICAgIG5vZGVfY2hlY2sgPSBTZXF1ZW5jZU5vZGUKKyAgICAgICAgICAgIGVsaWYgbm9kZV9jaGVjayBpcyBkaWN0OgorICAgICAgICAgICAgICAgIG5vZGVfY2hlY2sgPSBNYXBwaW5nTm9kZQorICAgICAgICAgICAgZWxpZiBub2RlX2NoZWNrIG5vdCBpbiBbU2NhbGFyTm9kZSwgU2VxdWVuY2VOb2RlLCBNYXBwaW5nTm9kZV0gIFwKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKG5vZGVfY2hlY2ssIGJhc2VzdHJpbmcpICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlX2NoZWNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlc29sdmVyRXJyb3IoIkludmFsaWQgbm9kZSBjaGVja2VyOiAlcyIgJSBub2RlX2NoZWNrKQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5kZXhfY2hlY2ssIChiYXNlc3RyaW5nLCBpbnQpKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgYW5kIGluZGV4X2NoZWNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlc29sdmVyRXJyb3IoIkludmFsaWQgaW5kZXggY2hlY2tlcjogJXMiICUgaW5kZXhfY2hlY2spCisgICAgICAgICAgICBuZXdfcGF0aC5hcHBlbmQoKG5vZGVfY2hlY2ssIGluZGV4X2NoZWNrKSkKKyAgICAgICAgaWYga2luZCBpcyBzdHI6CisgICAgICAgICAgICBraW5kID0gU2NhbGFyTm9kZQorICAgICAgICBlbGlmIGtpbmQgaXMgbGlzdDoKKyAgICAgICAgICAgIGtpbmQgPSBTZXF1ZW5jZU5vZGUKKyAgICAgICAgZWxpZiBraW5kIGlzIGRpY3Q6CisgICAgICAgICAgICBraW5kID0gTWFwcGluZ05vZGUKKyAgICAgICAgZWxpZiBraW5kIG5vdCBpbiBbU2NhbGFyTm9kZSwgU2VxdWVuY2VOb2RlLCBNYXBwaW5nTm9kZV0gICAgXAorICAgICAgICAgICAgICAgIGFuZCBraW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgUmVzb2x2ZXJFcnJvcigiSW52YWxpZCBub2RlIGtpbmQ6ICVzIiAlIGtpbmQpCisgICAgICAgIGNscy55YW1sX3BhdGhfcmVzb2x2ZXJzW3R1cGxlKG5ld19wYXRoKSwga2luZF0gPSB0YWcKKyAgICBhZGRfcGF0aF9yZXNvbHZlciA9IGNsYXNzbWV0aG9kKGFkZF9wYXRoX3Jlc29sdmVyKQorCisgICAgZGVmIGRlc2NlbmRfcmVzb2x2ZXIoc2VsZiwgY3VycmVudF9ub2RlLCBjdXJyZW50X2luZGV4KToKKyAgICAgICAgaWYgbm90IHNlbGYueWFtbF9wYXRoX3Jlc29sdmVyczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGFjdF9wYXRocyA9IHt9CisgICAgICAgIHByZWZpeF9wYXRocyA9IFtdCisgICAgICAgIGlmIGN1cnJlbnRfbm9kZToKKyAgICAgICAgICAgIGRlcHRoID0gbGVuKHNlbGYucmVzb2x2ZXJfcHJlZml4X3BhdGhzKQorICAgICAgICAgICAgZm9yIHBhdGgsIGtpbmQgaW4gc2VsZi5yZXNvbHZlcl9wcmVmaXhfcGF0aHNbLTFdOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfcmVzb2x2ZXJfcHJlZml4KGRlcHRoLCBwYXRoLCBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLCBjdXJyZW50X2luZGV4KToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHBhdGgpID4gZGVwdGg6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfcGF0aHMuYXBwZW5kKChwYXRoLCBraW5kKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0X3BhdGhzW2tpbmRdID0gc2VsZi55YW1sX3BhdGhfcmVzb2x2ZXJzW3BhdGgsIGtpbmRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgcGF0aCwga2luZCBpbiBzZWxmLnlhbWxfcGF0aF9yZXNvbHZlcnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgICAgIGV4YWN0X3BhdGhzW2tpbmRdID0gc2VsZi55YW1sX3BhdGhfcmVzb2x2ZXJzW3BhdGgsIGtpbmRdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3BhdGhzLmFwcGVuZCgocGF0aCwga2luZCkpCisgICAgICAgIHNlbGYucmVzb2x2ZXJfZXhhY3RfcGF0aHMuYXBwZW5kKGV4YWN0X3BhdGhzKQorICAgICAgICBzZWxmLnJlc29sdmVyX3ByZWZpeF9wYXRocy5hcHBlbmQocHJlZml4X3BhdGhzKQorCisgICAgZGVmIGFzY2VuZF9yZXNvbHZlcihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYueWFtbF9wYXRoX3Jlc29sdmVyczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJlc29sdmVyX2V4YWN0X3BhdGhzLnBvcCgpCisgICAgICAgIHNlbGYucmVzb2x2ZXJfcHJlZml4X3BhdGhzLnBvcCgpCisKKyAgICBkZWYgY2hlY2tfcmVzb2x2ZXJfcHJlZml4KHNlbGYsIGRlcHRoLCBwYXRoLCBraW5kLAorICAgICAgICAgICAgY3VycmVudF9ub2RlLCBjdXJyZW50X2luZGV4KToKKyAgICAgICAgbm9kZV9jaGVjaywgaW5kZXhfY2hlY2sgPSBwYXRoW2RlcHRoLTFdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZV9jaGVjaywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUudGFnICE9IG5vZGVfY2hlY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgbm9kZV9jaGVjayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGN1cnJlbnRfbm9kZSwgbm9kZV9jaGVjayk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGluZGV4X2NoZWNrIGlzIFRydWUgYW5kIGN1cnJlbnRfaW5kZXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgKGluZGV4X2NoZWNrIGlzIEZhbHNlIG9yIGluZGV4X2NoZWNrIGlzIE5vbmUpICAgIFwKKyAgICAgICAgICAgICAgICBhbmQgY3VycmVudF9pbmRleCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXhfY2hlY2ssIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGN1cnJlbnRfaW5kZXgsIFNjYWxhck5vZGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBpbmRleF9jaGVjayA9PSBjdXJyZW50X2luZGV4LnZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZGV4X2NoZWNrLCBpbnQpIGFuZCBub3QgaXNpbnN0YW5jZShpbmRleF9jaGVjaywgYm9vbCk6CisgICAgICAgICAgICBpZiBpbmRleF9jaGVjayAhPSBjdXJyZW50X2luZGV4OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlc29sdmUoc2VsZiwga2luZCwgdmFsdWUsIGltcGxpY2l0KToKKyAgICAgICAgaWYga2luZCBpcyBTY2FsYXJOb2RlIGFuZCBpbXBsaWNpdFswXToKKyAgICAgICAgICAgIGlmIHZhbHVlID09IHUnJzoKKyAgICAgICAgICAgICAgICByZXNvbHZlcnMgPSBzZWxmLnlhbWxfaW1wbGljaXRfcmVzb2x2ZXJzLmdldCh1JycsIFtdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXNvbHZlcnMgPSBzZWxmLnlhbWxfaW1wbGljaXRfcmVzb2x2ZXJzLmdldCh2YWx1ZVswXSwgW10pCisgICAgICAgICAgICByZXNvbHZlcnMgKz0gc2VsZi55YW1sX2ltcGxpY2l0X3Jlc29sdmVycy5nZXQoTm9uZSwgW10pCisgICAgICAgICAgICBmb3IgdGFnLCByZWdleHAgaW4gcmVzb2x2ZXJzOgorICAgICAgICAgICAgICAgIGlmIHJlZ2V4cC5tYXRjaCh2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWcKKyAgICAgICAgICAgIGltcGxpY2l0ID0gaW1wbGljaXRbMV0KKyAgICAgICAgaWYgc2VsZi55YW1sX3BhdGhfcmVzb2x2ZXJzOgorICAgICAgICAgICAgZXhhY3RfcGF0aHMgPSBzZWxmLnJlc29sdmVyX2V4YWN0X3BhdGhzWy0xXQorICAgICAgICAgICAgaWYga2luZCBpbiBleGFjdF9wYXRoczoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhhY3RfcGF0aHNba2luZF0KKyAgICAgICAgICAgIGlmIE5vbmUgaW4gZXhhY3RfcGF0aHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4YWN0X3BhdGhzW05vbmVdCisgICAgICAgIGlmIGtpbmQgaXMgU2NhbGFyTm9kZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkRFRkFVTFRfU0NBTEFSX1RBRworICAgICAgICBlbGlmIGtpbmQgaXMgU2VxdWVuY2VOb2RlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuREVGQVVMVF9TRVFVRU5DRV9UQUcKKyAgICAgICAgZWxpZiBraW5kIGlzIE1hcHBpbmdOb2RlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuREVGQVVMVF9NQVBQSU5HX1RBRworCitjbGFzcyBSZXNvbHZlcihCYXNlUmVzb2x2ZXIpOgorICAgIHBhc3MKKworUmVzb2x2ZXIuYWRkX2ltcGxpY2l0X3Jlc29sdmVyKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLAorICAgICAgICByZS5jb21waWxlKHVyJycnXig/Onllc3xZZXN8WUVTfG5vfE5vfE5PCisgICAgICAgICAgICAgICAgICAgIHx0cnVlfFRydWV8VFJVRXxmYWxzZXxGYWxzZXxGQUxTRQorICAgICAgICAgICAgICAgICAgICB8b258T258T058b2ZmfE9mZnxPRkYpJCcnJywgcmUuWCksCisgICAgICAgIGxpc3QodSd5WW5OdFRmRm9PJykpCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsCisgICAgICAgIHJlLmNvbXBpbGUodXInJydeKD86Wy0rXT8oPzpbMC05XVswLTlfXSopXC5bMC05X10qKD86W2VFXVstK11bMC05XSspPworICAgICAgICAgICAgICAgICAgICB8XC5bMC05X10rKD86W2VFXVstK11bMC05XSspPworICAgICAgICAgICAgICAgICAgICB8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1wuWzAtOV9dKgorICAgICAgICAgICAgICAgICAgICB8Wy0rXT9cLig/OmluZnxJbmZ8SU5GKQorICAgICAgICAgICAgICAgICAgICB8XC4oPzpuYW58TmFOfE5BTikpJCcnJywgcmUuWCksCisgICAgICAgIGxpc3QodSctKzAxMjM0NTY3ODkuJykpCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLAorICAgICAgICByZS5jb21waWxlKHVyJycnXig/OlstK10/MGJbMC0xX10rCisgICAgICAgICAgICAgICAgICAgIHxbLStdPzBbMC03X10rCisgICAgICAgICAgICAgICAgICAgIHxbLStdPyg/OjB8WzEtOV1bMC05X10qKQorICAgICAgICAgICAgICAgICAgICB8Wy0rXT8weFswLTlhLWZBLUZfXSsKKyAgICAgICAgICAgICAgICAgICAgfFstK10/WzEtOV1bMC05X10qKD86OlswLTVdP1swLTldKSspJCcnJywgcmUuWCksCisgICAgICAgIGxpc3QodSctKzAxMjM0NTY3ODknKSkKKworUmVzb2x2ZXIuYWRkX2ltcGxpY2l0X3Jlc29sdmVyKAorICAgICAgICB1J3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJywKKyAgICAgICAgcmUuY29tcGlsZSh1cideKD86PDwpJCcpLAorICAgICAgICBbdSc8J10pCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywKKyAgICAgICAgcmUuY29tcGlsZSh1cicnJ14oPzogfgorICAgICAgICAgICAgICAgICAgICB8bnVsbHxOdWxsfE5VTEwKKyAgICAgICAgICAgICAgICAgICAgfCApJCcnJywgcmUuWCksCisgICAgICAgIFt1J34nLCB1J24nLCB1J04nLCB1JyddKQorCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgIHUndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywKKyAgICAgICAgcmUuY29tcGlsZSh1cicnJ14oPzpbMC05XVswLTldWzAtOV1bMC05XS1bMC05XVswLTldLVswLTldWzAtOV0KKyAgICAgICAgICAgICAgICAgICAgfFswLTldWzAtOV1bMC05XVswLTldIC1bMC05XVswLTldPyAtWzAtOV1bMC05XT8KKyAgICAgICAgICAgICAgICAgICAgICg/OltUdF18WyBcdF0rKVswLTldWzAtOV0/CisgICAgICAgICAgICAgICAgICAgICA6WzAtOV1bMC05XSA6WzAtOV1bMC05XSAoPzpcLlswLTldKik/CisgICAgICAgICAgICAgICAgICAgICAoPzpbIFx0XSooPzpafFstK11bMC05XVswLTldPyg/OjpbMC05XVswLTldKT8pKT8pJCcnJywgcmUuWCksCisgICAgICAgIGxpc3QodScwMTIzNDU2Nzg5JykpCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjp2YWx1ZScsCisgICAgICAgIHJlLmNvbXBpbGUodXInXig/Oj0pJCcpLAorICAgICAgICBbdSc9J10pCisKKyMgVGhlIGZvbGxvd2luZyByZXNvbHZlciBpcyBvbmx5IGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzLiBJdCBjYW5ub3Qgd29yaworIyBiZWNhdXNlIHBsYWluIHNjYWxhcnMgY2Fubm90IHN0YXJ0IHdpdGggJyEnLCAnJicsIG9yICcqJy4KK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgdSd0YWc6eWFtbC5vcmcsMjAwMjp5YW1sJywKKyAgICAgICAgcmUuY29tcGlsZSh1cideKD86IXwmfFwqKSQnKSwKKyAgICAgICAgbGlzdCh1JyEmKicpKQorCmRpZmYgLS1naXQgYS9saWIveWFtbC9zY2FubmVyLnB5IGIvbGliL3lhbWwvc2Nhbm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRmNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvc2Nhbm5lci5weQpAQCAtMCwwICsxLDE0NTMgQEAKKworIyBTY2FubmVyIHByb2R1Y2VzIHRva2VucyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorIyBTVFJFQU0tU1RBUlQKKyMgU1RSRUFNLUVORAorIyBESVJFQ1RJVkUobmFtZSwgdmFsdWUpCisjIERPQ1VNRU5ULVNUQVJUCisjIERPQ1VNRU5ULUVORAorIyBCTE9DSy1TRVFVRU5DRS1TVEFSVAorIyBCTE9DSy1NQVBQSU5HLVNUQVJUCisjIEJMT0NLLUVORAorIyBGTE9XLVNFUVVFTkNFLVNUQVJUCisjIEZMT1ctTUFQUElORy1TVEFSVAorIyBGTE9XLVNFUVVFTkNFLUVORAorIyBGTE9XLU1BUFBJTkctRU5ECisjIEJMT0NLLUVOVFJZCisjIEZMT1ctRU5UUlkKKyMgS0VZCisjIFZBTFVFCisjIEFMSUFTKHZhbHVlKQorIyBBTkNIT1IodmFsdWUpCisjIFRBRyh2YWx1ZSkKKyMgU0NBTEFSKHZhbHVlLCBwbGFpbiwgc3R5bGUpCisjCisjIFJlYWQgY29tbWVudHMgaW4gdGhlIFNjYW5uZXIgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgorIworCitfX2FsbF9fID0gWydTY2FubmVyJywgJ1NjYW5uZXJFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0IE1hcmtlZFlBTUxFcnJvcgorZnJvbSB0b2tlbnMgaW1wb3J0ICoKKworY2xhc3MgU2Nhbm5lckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBTaW1wbGVLZXkob2JqZWN0KToKKyAgICAjIFNlZSBiZWxvdyBzaW1wbGUga2V5cyB0cmVhdG1lbnQuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5fbnVtYmVyLCByZXF1aXJlZCwgaW5kZXgsIGxpbmUsIGNvbHVtbiwgbWFyayk6CisgICAgICAgIHNlbGYudG9rZW5fbnVtYmVyID0gdG9rZW5fbnVtYmVyCisgICAgICAgIHNlbGYucmVxdWlyZWQgPSByZXF1aXJlZAorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorICAgICAgICBzZWxmLmNvbHVtbiA9IGNvbHVtbgorICAgICAgICBzZWxmLm1hcmsgPSBtYXJrCisKK2NsYXNzIFNjYW5uZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgc2Nhbm5lci4iIiIKKyAgICAgICAgIyBJdCBpcyBhc3N1bWVkIHRoYXQgU2Nhbm5lciBhbmQgUmVhZGVyIHdpbGwgaGF2ZSBhIGNvbW1vbiBkZXNjZW5kYW50LgorICAgICAgICAjIFJlYWRlciBkbyB0aGUgZGlydHkgd29yayBvZiBjaGVja2luZyBmb3IgQk9NIGFuZCBjb252ZXJ0aW5nIHRoZQorICAgICAgICAjIGlucHV0IGRhdGEgdG8gVW5pY29kZS4gSXQgYWxzbyBhZGRzIE5VTCB0byB0aGUgZW5kLgorICAgICAgICAjCisgICAgICAgICMgUmVhZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcworICAgICAgICAjICAgc2VsZi5wZWVrKGk9MCkgICAgICAgIyBwZWVrIHRoZSBuZXh0IGktdGggY2hhcmFjdGVyCisgICAgICAgICMgICBzZWxmLnByZWZpeChsPTEpICAgICAjIHBlZWsgdGhlIG5leHQgbCBjaGFyYWN0ZXJzCisgICAgICAgICMgICBzZWxmLmZvcndhcmQobD0xKSAgICAjIHJlYWQgdGhlIG5leHQgbCBjaGFyYWN0ZXJzIGFuZCBtb3ZlIHRoZSBwb2ludGVyLgorCisgICAgICAgICMgSGFkIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtPworICAgICAgICBzZWxmLmRvbmUgPSBGYWxzZQorCisgICAgICAgICMgVGhlIG51bWJlciBvZiB1bmNsb3NlZCAneycgYW5kICdbJy4gYGZsb3dfbGV2ZWwgPT0gMGAgbWVhbnMgYmxvY2sKKyAgICAgICAgIyBjb250ZXh0LgorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgPSAwCisKKyAgICAgICAgIyBMaXN0IG9mIHByb2Nlc3NlZCB0b2tlbnMgdGhhdCBhcmUgbm90IHlldCBlbWl0dGVkLgorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisKKyAgICAgICAgIyBBZGQgdGhlIFNUUkVBTS1TVEFSVCB0b2tlbi4KKyAgICAgICAgc2VsZi5mZXRjaF9zdHJlYW1fc3RhcnQoKQorCisgICAgICAgICMgTnVtYmVyIG9mIHRva2VucyB0aGF0IHdlcmUgZW1pdHRlZCB0aHJvdWdoIHRoZSBgZ2V0X3Rva2VuYCBtZXRob2QuCisgICAgICAgIHNlbGYudG9rZW5zX3Rha2VuID0gMAorCisgICAgICAgICMgVGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCisgICAgICAgIHNlbGYuaW5kZW50ID0gLTEKKworICAgICAgICAjIFBhc3QgaW5kZW50YXRpb24gbGV2ZWxzLgorICAgICAgICBzZWxmLmluZGVudHMgPSBbXQorCisgICAgICAgICMgVmFyaWFibGVzIHJlbGF0ZWQgdG8gc2ltcGxlIGtleXMgdHJlYXRtZW50LgorCisgICAgICAgICMgQSBzaW1wbGUga2V5IGlzIGEga2V5IHRoYXQgaXMgbm90IGRlbm90ZWQgYnkgdGhlICc/JyBpbmRpY2F0b3IuCisgICAgICAgICMgRXhhbXBsZSBvZiBzaW1wbGUga2V5czoKKyAgICAgICAgIyAgIC0tLQorICAgICAgICAjICAgYmxvY2sgc2ltcGxlIGtleTogdmFsdWUKKyAgICAgICAgIyAgID8gbm90IGEgc2ltcGxlIGtleToKKyAgICAgICAgIyAgIDogeyBmbG93IHNpbXBsZSBrZXk6IHZhbHVlIH0KKyAgICAgICAgIyBXZSBlbWl0IHRoZSBLRVkgdG9rZW4gYmVmb3JlIGFsbCBrZXlzLCBzbyB3aGVuIHdlIGZpbmQgYSBwb3RlbnRpYWwKKyAgICAgICAgIyBzaW1wbGUga2V5LCB3ZSB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nICc6JyBpbmRpY2F0b3IuCisgICAgICAgICMgU2ltcGxlIGtleXMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gYSBzaW5nbGUgbGluZSBhbmQgMTAyNCBjaGFyYWN0ZXJzLgorCisgICAgICAgICMgQ2FuIGEgc2ltcGxlIGtleSBzdGFydCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbj8gQSBzaW1wbGUga2V5IG1heQorICAgICAgICAjIHN0YXJ0OgorICAgICAgICAjIC0gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSwgbm90IGNvdW50aW5nIGluZGVudGF0aW9uIHNwYWNlcworICAgICAgICAjICAgICAgIChpbiBibG9jayBjb250ZXh0KSwKKyAgICAgICAgIyAtIGFmdGVyICd7JywgJ1snLCAnLCcgKGluIHRoZSBmbG93IGNvbnRleHQpLAorICAgICAgICAjIC0gYWZ0ZXIgJz8nLCAnOicsICctJyAoaW4gdGhlIGJsb2NrIGNvbnRleHQpLgorICAgICAgICAjIEluIHRoZSBibG9jayBjb250ZXh0LCB0aGlzIGZsYWcgYWxzbyBzaWduaWZpZXMgaWYgYSBibG9jayBjb2xsZWN0aW9uCisgICAgICAgICMgbWF5IHN0YXJ0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBUcnVlCisKKyAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHBvc3NpYmxlIHNpbXBsZSBrZXlzLiBUaGlzIGlzIGEgZGljdGlvbmFyeS4gVGhlIGtleQorICAgICAgICAjIGlzIGBmbG93X2xldmVsYDsgdGhlcmUgY2FuIGJlIG5vIG1vcmUgdGhhdCBvbmUgcG9zc2libGUgc2ltcGxlIGtleQorICAgICAgICAjIGZvciBlYWNoIGxldmVsLiBUaGUgdmFsdWUgaXMgYSBTaW1wbGVLZXkgcmVjb3JkOgorICAgICAgICAjICAgKHRva2VuX251bWJlciwgcmVxdWlyZWQsIGluZGV4LCBsaW5lLCBjb2x1bW4sIG1hcmspCisgICAgICAgICMgQSBzaW1wbGUga2V5IG1heSBzdGFydCB3aXRoIEFMSUFTLCBBTkNIT1IsIFRBRywgU0NBTEFSKGZsb3cpLAorICAgICAgICAjICdbJywgb3IgJ3snIHRva2Vucy4KKyAgICAgICAgc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5cyA9IHt9CisKKyAgICAjIFB1YmxpYyBtZXRob2RzLgorCisgICAgZGVmIGNoZWNrX3Rva2VuKHNlbGYsICpjaG9pY2VzKToKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgbmV4dCB0b2tlbiBpcyBvbmUgb2YgdGhlIGdpdmVuIHR5cGVzLgorICAgICAgICB3aGlsZSBzZWxmLm5lZWRfbW9yZV90b2tlbnMoKToKKyAgICAgICAgICAgIHNlbGYuZmV0Y2hfbW9yZV90b2tlbnMoKQorICAgICAgICBpZiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIGlmIG5vdCBjaG9pY2VzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBmb3IgY2hvaWNlIGluIGNob2ljZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnRva2Vuc1swXSwgY2hvaWNlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcGVla190b2tlbihzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gdGhlIG5leHQgdG9rZW4sIGJ1dCBkbyBub3QgZGVsZXRlIGlmIGZyb20gdGhlIHF1ZXVlLgorICAgICAgICB3aGlsZSBzZWxmLm5lZWRfbW9yZV90b2tlbnMoKToKKyAgICAgICAgICAgIHNlbGYuZmV0Y2hfbW9yZV90b2tlbnMoKQorICAgICAgICBpZiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2Vuc1swXQorCisgICAgZGVmIGdldF90b2tlbihzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gdGhlIG5leHQgdG9rZW4uCisgICAgICAgIHdoaWxlIHNlbGYubmVlZF9tb3JlX3Rva2VucygpOgorICAgICAgICAgICAgc2VsZi5mZXRjaF9tb3JlX3Rva2VucygpCisgICAgICAgIGlmIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgc2VsZi50b2tlbnNfdGFrZW4gKz0gMQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zLnBvcCgwKQorCisgICAgIyBQcml2YXRlIG1ldGhvZHMuCisKKyAgICBkZWYgbmVlZF9tb3JlX3Rva2VucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIG5vdCBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgVGhlIGN1cnJlbnQgdG9rZW4gbWF5IGJlIGEgcG90ZW50aWFsIHNpbXBsZSBrZXksIHNvIHdlCisgICAgICAgICMgbmVlZCB0byBsb29rIGZ1cnRoZXIuCisgICAgICAgIHNlbGYuc3RhbGVfcG9zc2libGVfc2ltcGxlX2tleXMoKQorICAgICAgICBpZiBzZWxmLm5leHRfcG9zc2libGVfc2ltcGxlX2tleSgpID09IHNlbGYudG9rZW5zX3Rha2VuOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBmZXRjaF9tb3JlX3Rva2VucyhzZWxmKToKKworICAgICAgICAjIEVhdCB3aGl0ZXNwYWNlcyBhbmQgY29tbWVudHMgdW50aWwgd2UgcmVhY2ggdGhlIG5leHQgdG9rZW4uCisgICAgICAgIHNlbGYuc2Nhbl90b19uZXh0X3Rva2VuKCkKKworICAgICAgICAjIFJlbW92ZSBvYnNvbGV0ZSBwb3NzaWJsZSBzaW1wbGUga2V5cy4KKyAgICAgICAgc2VsZi5zdGFsZV9wb3NzaWJsZV9zaW1wbGVfa2V5cygpCisKKyAgICAgICAgIyBDb21wYXJlIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGFuZCBjb2x1bW4uIEl0IG1heSBhZGQgc29tZSB0b2tlbnMKKyAgICAgICAgIyBhbmQgZGVjcmVhc2UgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCisgICAgICAgIHNlbGYudW53aW5kX2luZGVudChzZWxmLmNvbHVtbikKKworICAgICAgICAjIFBlZWsgdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgZW5kIG9mIHN0cmVhbT8KKyAgICAgICAgaWYgY2ggPT0gdSdcMCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9zdHJlYW1fZW5kKCkKKworICAgICAgICAjIElzIGl0IGEgZGlyZWN0aXZlPworICAgICAgICBpZiBjaCA9PSB1JyUnIGFuZCBzZWxmLmNoZWNrX2RpcmVjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZGlyZWN0aXZlKCkKKworICAgICAgICAjIElzIGl0IHRoZSBkb2N1bWVudCBzdGFydD8KKyAgICAgICAgaWYgY2ggPT0gdSctJyBhbmQgc2VsZi5jaGVja19kb2N1bWVudF9zdGFydCgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZG9jdW1lbnRfc3RhcnQoKQorCisgICAgICAgICMgSXMgaXQgdGhlIGRvY3VtZW50IGVuZD8KKyAgICAgICAgaWYgY2ggPT0gdScuJyBhbmQgc2VsZi5jaGVja19kb2N1bWVudF9lbmQoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2RvY3VtZW50X2VuZCgpCisKKyAgICAgICAgIyBUT0RPOiBzdXBwb3J0IGZvciBCT00gd2l0aGluIGEgc3RyZWFtLgorICAgICAgICAjaWYgY2ggPT0gdSdcdUZFRkYnOgorICAgICAgICAjICAgIHJldHVybiBzZWxmLmZldGNoX2JvbSgpICAgIDwtLSBpc3N1ZSBCT01Ub2tlbgorCisgICAgICAgICMgTm90ZTogdGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgY2hlY2tzIGlzIE5PVCBzaWduaWZpY2FudC4KKworICAgICAgICAjIElzIGl0IHRoZSBmbG93IHNlcXVlbmNlIHN0YXJ0IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gdSdbJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2Zsb3dfc2VxdWVuY2Vfc3RhcnQoKQorCisgICAgICAgICMgSXMgaXQgdGhlIGZsb3cgbWFwcGluZyBzdGFydCBpbmRpY2F0b3I/CisgICAgICAgIGlmIGNoID09IHUneyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9mbG93X21hcHBpbmdfc3RhcnQoKQorCisgICAgICAgICMgSXMgaXQgdGhlIGZsb3cgc2VxdWVuY2UgZW5kIGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gdSddJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2Zsb3dfc2VxdWVuY2VfZW5kKCkKKworICAgICAgICAjIElzIGl0IHRoZSBmbG93IG1hcHBpbmcgZW5kIGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gdSd9JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2Zsb3dfbWFwcGluZ19lbmQoKQorCisgICAgICAgICMgSXMgaXQgdGhlIGZsb3cgZW50cnkgaW5kaWNhdG9yPworICAgICAgICBpZiBjaCA9PSB1JywnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZmxvd19lbnRyeSgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgYmxvY2sgZW50cnkgaW5kaWNhdG9yPworICAgICAgICBpZiBjaCA9PSB1Jy0nIGFuZCBzZWxmLmNoZWNrX2Jsb2NrX2VudHJ5KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9ibG9ja19lbnRyeSgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUga2V5IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gdSc/JyBhbmQgc2VsZi5jaGVja19rZXkoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2tleSgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgdmFsdWUgaW5kaWNhdG9yPworICAgICAgICBpZiBjaCA9PSB1JzonIGFuZCBzZWxmLmNoZWNrX3ZhbHVlKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF92YWx1ZSgpCisKKyAgICAgICAgIyBJcyBpdCBhbiBhbGlhcz8KKyAgICAgICAgaWYgY2ggPT0gdScqJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2FsaWFzKCkKKworICAgICAgICAjIElzIGl0IGFuIGFuY2hvcj8KKyAgICAgICAgaWYgY2ggPT0gdScmJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2FuY2hvcigpCisKKyAgICAgICAgIyBJcyBpdCBhIHRhZz8KKyAgICAgICAgaWYgY2ggPT0gdSchJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX3RhZygpCisKKyAgICAgICAgIyBJcyBpdCBhIGxpdGVyYWwgc2NhbGFyPworICAgICAgICBpZiBjaCA9PSB1J3wnIGFuZCBub3Qgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfbGl0ZXJhbCgpCisKKyAgICAgICAgIyBJcyBpdCBhIGZvbGRlZCBzY2FsYXI/CisgICAgICAgIGlmIGNoID09IHUnPicgYW5kIG5vdCBzZWxmLmZsb3dfbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9mb2xkZWQoKQorCisgICAgICAgICMgSXMgaXQgYSBzaW5nbGUgcXVvdGVkIHNjYWxhcj8KKyAgICAgICAgaWYgY2ggPT0gdSdcJyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9zaW5nbGUoKQorCisgICAgICAgICMgSXMgaXQgYSBkb3VibGUgcXVvdGVkIHNjYWxhcj8KKyAgICAgICAgaWYgY2ggPT0gdSdcIic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9kb3VibGUoKQorCisgICAgICAgICMgSXQgbXVzdCBiZSBhIHBsYWluIHNjYWxhciB0aGVuLgorICAgICAgICBpZiBzZWxmLmNoZWNrX3BsYWluKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9wbGFpbigpCisKKyAgICAgICAgIyBObz8gSXQncyBhbiBlcnJvci4gTGV0J3MgcHJvZHVjZSBhIG5pY2UgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBmb3IgdGhlIG5leHQgdG9rZW4iLCBOb25lLAorICAgICAgICAgICAgICAgICJmb3VuZCBjaGFyYWN0ZXIgJXIgdGhhdCBjYW5ub3Qgc3RhcnQgYW55IHRva2VuIgorICAgICAgICAgICAgICAgICUgY2guZW5jb2RlKCd1dGYtOCcpLCBzZWxmLmdldF9tYXJrKCkpCisKKyAgICAjIFNpbXBsZSBrZXlzIHRyZWF0bWVudC4KKworICAgIGRlZiBuZXh0X3Bvc3NpYmxlX3NpbXBsZV9rZXkoc2VsZik6CisgICAgICAgICMgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIG5lYXJlc3QgcG9zc2libGUgc2ltcGxlIGtleS4gQWN0dWFsbHkgd2UKKyAgICAgICAgIyBkb24ndCBuZWVkIHRvIGxvb3AgdGhyb3VnaCB0aGUgd2hvbGUgZGljdGlvbmFyeS4gV2UgbWF5IHJlcGxhY2UgaXQKKyAgICAgICAgIyB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToKKyAgICAgICAgIyAgIGlmIG5vdCBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzOgorICAgICAgICAjICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgICByZXR1cm4gc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1sKKyAgICAgICAgIyAgICAgICAgICAgbWluKHNlbGYucG9zc2libGVfc2ltcGxlX2tleXMua2V5cygpKV0udG9rZW5fbnVtYmVyCisgICAgICAgIG1pbl90b2tlbl9udW1iZXIgPSBOb25lCisgICAgICAgIGZvciBsZXZlbCBpbiBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzOgorICAgICAgICAgICAga2V5ID0gc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1tsZXZlbF0KKyAgICAgICAgICAgIGlmIG1pbl90b2tlbl9udW1iZXIgaXMgTm9uZSBvciBrZXkudG9rZW5fbnVtYmVyIDwgbWluX3Rva2VuX251bWJlcjoKKyAgICAgICAgICAgICAgICBtaW5fdG9rZW5fbnVtYmVyID0ga2V5LnRva2VuX251bWJlcgorICAgICAgICByZXR1cm4gbWluX3Rva2VuX251bWJlcgorCisgICAgZGVmIHN0YWxlX3Bvc3NpYmxlX3NpbXBsZV9rZXlzKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBlbnRyaWVzIHRoYXQgYXJlIG5vIGxvbmdlciBwb3NzaWJsZSBzaW1wbGUga2V5cy4gQWNjb3JkaW5nIHRvCisgICAgICAgICMgdGhlIFlBTUwgc3BlY2lmaWNhdGlvbiwgc2ltcGxlIGtleXMKKyAgICAgICAgIyAtIHNob3VsZCBiZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGxpbmUsCisgICAgICAgICMgLSBzaG91bGQgYmUgbm8gbG9uZ2VyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzLgorICAgICAgICAjIERpc2FibGluZyB0aGlzIHByb2NlZHVyZSB3aWxsIGFsbG93IHNpbXBsZSBrZXlzIG9mIGFueSBsZW5ndGggYW5kCisgICAgICAgICMgaGVpZ2h0IChtYXkgY2F1c2UgcHJvYmxlbXMgaWYgaW5kZW50YXRpb24gaXMgYnJva2VuIHRob3VnaCkuCisgICAgICAgIGZvciBsZXZlbCBpbiBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzLmtleXMoKToKKyAgICAgICAgICAgIGtleSA9IHNlbGYucG9zc2libGVfc2ltcGxlX2tleXNbbGV2ZWxdCisgICAgICAgICAgICBpZiBrZXkubGluZSAhPSBzZWxmLmxpbmUgIFwKKyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5pbmRleC1rZXkuaW5kZXggPiAxMDI0OgorICAgICAgICAgICAgICAgIGlmIGtleS5yZXF1aXJlZDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIHNpbXBsZSBrZXkiLCBrZXkubWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgJzonIiwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW2xldmVsXQorCisgICAgZGVmIHNhdmVfcG9zc2libGVfc2ltcGxlX2tleShzZWxmKToKKyAgICAgICAgIyBUaGUgbmV4dCB0b2tlbiBtYXkgc3RhcnQgYSBzaW1wbGUga2V5LiBXZSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlCisgICAgICAgICMgYW5kIHNhdmUgaXRzIHBvc2l0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IKKyAgICAgICAgIyAgIEFMSUFTLCBBTkNIT1IsIFRBRywgU0NBTEFSKGZsb3cpLCAnWycsIGFuZCAneycuCisKKyAgICAgICAgIyBDaGVjayBpZiBhIHNpbXBsZSBrZXkgaXMgcmVxdWlyZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICAgIHJlcXVpcmVkID0gbm90IHNlbGYuZmxvd19sZXZlbCBhbmQgc2VsZi5pbmRlbnQgPT0gc2VsZi5jb2x1bW4KKworICAgICAgICAjIFRoZSBuZXh0IHRva2VuIG1pZ2h0IGJlIGEgc2ltcGxlIGtleS4gTGV0J3Mgc2F2ZSBpdCdzIG51bWJlciBhbmQKKyAgICAgICAgIyBwb3NpdGlvbi4KKyAgICAgICAgaWYgc2VsZi5hbGxvd19zaW1wbGVfa2V5OgorICAgICAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisgICAgICAgICAgICB0b2tlbl9udW1iZXIgPSBzZWxmLnRva2Vuc190YWtlbitsZW4oc2VsZi50b2tlbnMpCisgICAgICAgICAgICBrZXkgPSBTaW1wbGVLZXkodG9rZW5fbnVtYmVyLCByZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRleCwgc2VsZi5saW5lLCBzZWxmLmNvbHVtbiwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1tzZWxmLmZsb3dfbGV2ZWxdID0ga2V5CisKKyAgICBkZWYgcmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoc2VsZik6CisgICAgICAgICMgUmVtb3ZlIHRoZSBzYXZlZCBwb3NzaWJsZSBrZXkgcG9zaXRpb24gYXQgdGhlIGN1cnJlbnQgZmxvdyBsZXZlbC4KKyAgICAgICAgaWYgc2VsZi5mbG93X2xldmVsIGluIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXM6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW3NlbGYuZmxvd19sZXZlbF0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYga2V5LnJlcXVpcmVkOgorICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBzaW1wbGUga2V5Iiwga2V5Lm1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgJzonIiwgc2VsZi5nZXRfbWFyaygpKQorCisgICAgICAgICAgICBkZWwgc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1tzZWxmLmZsb3dfbGV2ZWxdCisKKyAgICAjIEluZGVudGF0aW9uIGZ1bmN0aW9ucy4KKworICAgIGRlZiB1bndpbmRfaW5kZW50KHNlbGYsIGNvbHVtbik6CisKKyAgICAgICAgIyMgSW4gZmxvdyBjb250ZXh0LCB0b2tlbnMgc2hvdWxkIHJlc3BlY3QgaW5kZW50YXRpb24uCisgICAgICAgICMjIEFjdHVhbGx5IHRoZSBjb25kaXRpb24gc2hvdWxkIGJlIGBzZWxmLmluZGVudCA+PSBjb2x1bW5gIGFjY29yZGluZyB0bworICAgICAgICAjIyB0aGUgc3BlYy4gQnV0IHRoaXMgY29uZGl0aW9uIHdpbGwgcHJvaGliaXQgaW50dWl0aXZlbHkgY29ycmVjdAorICAgICAgICAjIyBjb25zdHJ1Y3Rpb25zIHN1Y2ggYXMKKyAgICAgICAgIyMga2V5IDogeworICAgICAgICAjIyB9CisgICAgICAgICNpZiBzZWxmLmZsb3dfbGV2ZWwgYW5kIHNlbGYuaW5kZW50ID4gY29sdW1uOgorICAgICAgICAjICAgIHJhaXNlIFNjYW5uZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAjICAgICAgICAgICAgImludmFsaWQgaW50ZW5kYXRpb24gb3IgdW5jbG9zZWQgJ1snIG9yICd7JyIsCisgICAgICAgICMgICAgICAgICAgICBzZWxmLmdldF9tYXJrKCkpCisKKyAgICAgICAgIyBJbiB0aGUgZmxvdyBjb250ZXh0LCBpbmRlbnRhdGlvbiBpcyBpZ25vcmVkLiBXZSBtYWtlIHRoZSBzY2FubmVyIGxlc3MKKyAgICAgICAgIyByZXN0cmljdGl2ZSB0aGVuIHNwZWNpZmljYXRpb24gcmVxdWlyZXMuCisgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSW4gYmxvY2sgY29udGV4dCwgd2UgbWF5IG5lZWQgdG8gaXNzdWUgdGhlIEJMT0NLLUVORCB0b2tlbnMuCisgICAgICAgIHdoaWxlIHNlbGYuaW5kZW50ID4gY29sdW1uOgorICAgICAgICAgICAgbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChCbG9ja0VuZFRva2VuKG1hcmssIG1hcmspKQorCisgICAgZGVmIGFkZF9pbmRlbnQoc2VsZiwgY29sdW1uKToKKyAgICAgICAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGluY3JlYXNlIGluZGVudGF0aW9uLgorICAgICAgICBpZiBzZWxmLmluZGVudCA8IGNvbHVtbjoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50cy5hcHBlbmQoc2VsZi5pbmRlbnQpCisgICAgICAgICAgICBzZWxmLmluZGVudCA9IGNvbHVtbgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIEZldGNoZXJzLgorCisgICAgZGVmIGZldGNoX3N0cmVhbV9zdGFydChzZWxmKToKKyAgICAgICAgIyBXZSBhbHdheXMgYWRkIFNUUkVBTS1TVEFSVCBhcyB0aGUgZmlyc3QgdG9rZW4gYW5kIFNUUkVBTS1FTkQgYXMgdGhlCisgICAgICAgICMgbGFzdCB0b2tlbi4KKworICAgICAgICAjIFJlYWQgdGhlIHRva2VuLgorICAgICAgICBtYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIAorICAgICAgICAjIEFkZCBTVFJFQU0tU1RBUlQuCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChTdHJlYW1TdGFydFRva2VuKG1hcmssIG1hcmssCisgICAgICAgICAgICBlbmNvZGluZz1zZWxmLmVuY29kaW5nKSkKKyAgICAgICAgCisKKyAgICBkZWYgZmV0Y2hfc3RyZWFtX2VuZChzZWxmKToKKworICAgICAgICAjIFNldCB0aGUgY3VycmVudCBpbnRlbmRhdGlvbiB0byAtMS4KKyAgICAgICAgc2VsZi51bndpbmRfaW5kZW50KC0xKQorCisgICAgICAgICMgUmVzZXQgc2ltcGxlIGtleXMuCisgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorICAgICAgICBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzID0ge30KKworICAgICAgICAjIFJlYWQgdGhlIHRva2VuLgorICAgICAgICBtYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIAorICAgICAgICAjIEFkZCBTVFJFQU0tRU5ELgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoU3RyZWFtRW5kVG9rZW4obWFyaywgbWFyaykpCisKKyAgICAgICAgIyBUaGUgc3RlYW0gaXMgZmluaXNoZWQuCisgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKKworICAgIGRlZiBmZXRjaF9kaXJlY3RpdmUoc2VsZik6CisgICAgICAgIAorICAgICAgICAjIFNldCB0aGUgY3VycmVudCBpbnRlbmRhdGlvbiB0byAtMS4KKyAgICAgICAgc2VsZi51bndpbmRfaW5kZW50KC0xKQorCisgICAgICAgICMgUmVzZXQgc2ltcGxlIGtleXMuCisgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIERJUkVDVElWRS4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9kaXJlY3RpdmUoKSkKKworICAgIGRlZiBmZXRjaF9kb2N1bWVudF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9kb2N1bWVudF9pbmRpY2F0b3IoRG9jdW1lbnRTdGFydFRva2VuKQorCisgICAgZGVmIGZldGNoX2RvY3VtZW50X2VuZChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9kb2N1bWVudF9pbmRpY2F0b3IoRG9jdW1lbnRFbmRUb2tlbikKKworICAgIGRlZiBmZXRjaF9kb2N1bWVudF9pbmRpY2F0b3Ioc2VsZiwgVG9rZW5DbGFzcyk6CisKKyAgICAgICAgIyBTZXQgdGhlIGN1cnJlbnQgaW50ZW5kYXRpb24gdG8gLTEuCisgICAgICAgIHNlbGYudW53aW5kX2luZGVudCgtMSkKKworICAgICAgICAjIFJlc2V0IHNpbXBsZSBrZXlzLiBOb3RlIHRoYXQgdGhlcmUgY291bGQgbm90IGJlIGEgYmxvY2sgY29sbGVjdGlvbgorICAgICAgICAjIGFmdGVyICctLS0nLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIEFkZCBET0NVTUVOVC1TVEFSVCBvciBET0NVTUVOVC1FTkQuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKDMpCisgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChUb2tlbkNsYXNzKHN0YXJ0X21hcmssIGVuZF9tYXJrKSkKKworICAgIGRlZiBmZXRjaF9mbG93X3NlcXVlbmNlX3N0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Zsb3dfY29sbGVjdGlvbl9zdGFydChGbG93U2VxdWVuY2VTdGFydFRva2VuKQorCisgICAgZGVmIGZldGNoX2Zsb3dfbWFwcGluZ19zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9mbG93X2NvbGxlY3Rpb25fc3RhcnQoRmxvd01hcHBpbmdTdGFydFRva2VuKQorCisgICAgZGVmIGZldGNoX2Zsb3dfY29sbGVjdGlvbl9zdGFydChzZWxmLCBUb2tlbkNsYXNzKToKKworICAgICAgICAjICdbJyBhbmQgJ3snIG1heSBzdGFydCBhIHNpbXBsZSBrZXkuCisgICAgICAgIHNlbGYuc2F2ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIEluY3JlYXNlIHRoZSBmbG93IGxldmVsLgorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgKz0gMQorCisgICAgICAgICMgU2ltcGxlIGtleXMgYXJlIGFsbG93ZWQgYWZ0ZXIgJ1snIGFuZCAneycuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IFRydWUKKworICAgICAgICAjIEFkZCBGTE9XLVNFUVVFTkNFLVNUQVJUIG9yIEZMT1ctTUFQUElORy1TVEFSVC4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoVG9rZW5DbGFzcyhzdGFydF9tYXJrLCBlbmRfbWFyaykpCisKKyAgICBkZWYgZmV0Y2hfZmxvd19zZXF1ZW5jZV9lbmQoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZmxvd19jb2xsZWN0aW9uX2VuZChGbG93U2VxdWVuY2VFbmRUb2tlbikKKworICAgIGRlZiBmZXRjaF9mbG93X21hcHBpbmdfZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Zsb3dfY29sbGVjdGlvbl9lbmQoRmxvd01hcHBpbmdFbmRUb2tlbikKKworICAgIGRlZiBmZXRjaF9mbG93X2NvbGxlY3Rpb25fZW5kKHNlbGYsIFRva2VuQ2xhc3MpOgorCisgICAgICAgICMgUmVzZXQgcG9zc2libGUgc2ltcGxlIGtleSBvbiB0aGUgY3VycmVudCBsZXZlbC4KKyAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBEZWNyZWFzZSB0aGUgZmxvdyBsZXZlbC4KKyAgICAgICAgc2VsZi5mbG93X2xldmVsIC09IDEKKworICAgICAgICAjIE5vIHNpbXBsZSBrZXlzIGFmdGVyICddJyBvciAnfScuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IEZhbHNlCisKKyAgICAgICAgIyBBZGQgRkxPVy1TRVFVRU5DRS1FTkQgb3IgRkxPVy1NQVBQSU5HLUVORC4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoVG9rZW5DbGFzcyhzdGFydF9tYXJrLCBlbmRfbWFyaykpCisKKyAgICBkZWYgZmV0Y2hfZmxvd19lbnRyeShzZWxmKToKKworICAgICAgICAjIFNpbXBsZSBrZXlzIGFyZSBhbGxvd2VkIGFmdGVyICcsJy4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gVHJ1ZQorCisgICAgICAgICMgUmVzZXQgcG9zc2libGUgc2ltcGxlIGtleSBvbiB0aGUgY3VycmVudCBsZXZlbC4KKyAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBBZGQgRkxPVy1FTlRSWS4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoRmxvd0VudHJ5VG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspKQorCisgICAgZGVmIGZldGNoX2Jsb2NrX2VudHJ5KHNlbGYpOgorCisgICAgICAgICMgQmxvY2sgY29udGV4dCBuZWVkcyBhZGRpdGlvbmFsIGNoZWNrcy4KKyAgICAgICAgaWYgbm90IHNlbGYuZmxvd19sZXZlbDoKKworICAgICAgICAgICAgIyBBcmUgd2UgYWxsb3dlZCB0byBzdGFydCBhIG5ldyBlbnRyeT8KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93X3NpbXBsZV9rZXk6CisgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UgZW50cmllcyBhcmUgbm90IGFsbG93ZWQgaGVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tYXJrKCkpCisKKyAgICAgICAgICAgICMgV2UgbWF5IG5lZWQgdG8gYWRkIEJMT0NLLVNFUVVFTkNFLVNUQVJULgorICAgICAgICAgICAgaWYgc2VsZi5hZGRfaW5kZW50KHNlbGYuY29sdW1uKToKKyAgICAgICAgICAgICAgICBtYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEJsb2NrU2VxdWVuY2VTdGFydFRva2VuKG1hcmssIG1hcmspKQorCisgICAgICAgICMgSXQncyBhbiBlcnJvciBmb3IgdGhlIGJsb2NrIGVudHJ5IHRvIG9jY3VyIGluIHRoZSBmbG93IGNvbnRleHQsCisgICAgICAgICMgYnV0IHdlIGxldCB0aGUgcGFyc2VyIGRldGVjdCB0aGlzLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgU2ltcGxlIGtleXMgYXJlIGFsbG93ZWQgYWZ0ZXIgJy0nLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBUcnVlCisKKyAgICAgICAgIyBSZXNldCBwb3NzaWJsZSBzaW1wbGUga2V5IG9uIHRoZSBjdXJyZW50IGxldmVsLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIEFkZCBCTE9DSy1FTlRSWS4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoQmxvY2tFbnRyeVRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKSkKKworICAgIGRlZiBmZXRjaF9rZXkoc2VsZik6CisgICAgICAgIAorICAgICAgICAjIEJsb2NrIGNvbnRleHQgbmVlZHMgYWRkaXRpb25hbCBjaGVja3MuCisgICAgICAgIGlmIG5vdCBzZWxmLmZsb3dfbGV2ZWw6CisKKyAgICAgICAgICAgICMgQXJlIHdlIGFsbG93ZWQgdG8gc3RhcnQgYSBrZXkgKG5vdCBuZXNzZXNhcnkgYSBzaW1wbGUpPworICAgICAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dfc2ltcGxlX2tleToKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXBwaW5nIGtleXMgYXJlIG5vdCBhbGxvd2VkIGhlcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorCisgICAgICAgICAgICAjIFdlIG1heSBuZWVkIHRvIGFkZCBCTE9DSy1NQVBQSU5HLVNUQVJULgorICAgICAgICAgICAgaWYgc2VsZi5hZGRfaW5kZW50KHNlbGYuY29sdW1uKToKKyAgICAgICAgICAgICAgICBtYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4obWFyaywgbWFyaykpCisKKyAgICAgICAgIyBTaW1wbGUga2V5cyBhcmUgYWxsb3dlZCBhZnRlciAnPycgaW4gdGhlIGJsb2NrIGNvbnRleHQuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IG5vdCBzZWxmLmZsb3dfbGV2ZWwKKworICAgICAgICAjIFJlc2V0IHBvc3NpYmxlIHNpbXBsZSBrZXkgb24gdGhlIGN1cnJlbnQgbGV2ZWwuCisgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgQWRkIEtFWS4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoS2V5VG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspKQorCisgICAgZGVmIGZldGNoX3ZhbHVlKHNlbGYpOgorCisgICAgICAgICMgRG8gd2UgZGV0ZXJtaW5lIGEgc2ltcGxlIGtleT8KKyAgICAgICAgaWYgc2VsZi5mbG93X2xldmVsIGluIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXM6CisKKyAgICAgICAgICAgICMgQWRkIEtFWS4KKyAgICAgICAgICAgIGtleSA9IHNlbGYucG9zc2libGVfc2ltcGxlX2tleXNbc2VsZi5mbG93X2xldmVsXQorICAgICAgICAgICAgZGVsIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXNbc2VsZi5mbG93X2xldmVsXQorICAgICAgICAgICAgc2VsZi50b2tlbnMuaW5zZXJ0KGtleS50b2tlbl9udW1iZXItc2VsZi50b2tlbnNfdGFrZW4sCisgICAgICAgICAgICAgICAgICAgIEtleVRva2VuKGtleS5tYXJrLCBrZXkubWFyaykpCisKKyAgICAgICAgICAgICMgSWYgdGhpcyBrZXkgc3RhcnRzIGEgbmV3IGJsb2NrIG1hcHBpbmcsIHdlIG5lZWQgdG8gYWRkCisgICAgICAgICAgICAjIEJMT0NLLU1BUFBJTkctU1RBUlQuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYWRkX2luZGVudChrZXkuY29sdW1uKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuaW5zZXJ0KGtleS50b2tlbl9udW1iZXItc2VsZi50b2tlbnNfdGFrZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNYXBwaW5nU3RhcnRUb2tlbihrZXkubWFyaywga2V5Lm1hcmspKQorCisgICAgICAgICAgICAjIFRoZXJlIGNhbm5vdCBiZSB0d28gc2ltcGxlIGtleXMgb25lIGFmdGVyIGFub3RoZXIuCisgICAgICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgSXQgbXVzdCBiZSBhIHBhcnQgb2YgYSBjb21wbGV4IGtleS4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBCbG9jayBjb250ZXh0IG5lZWRzIGFkZGl0aW9uYWwgY2hlY2tzLgorICAgICAgICAgICAgIyAoRG8gd2UgcmVhbGx5IG5lZWQgdGhlbT8gVGhleSB3aWxsIGJlIGNhdGNoZWQgYnkgdGhlIHBhcnNlcgorICAgICAgICAgICAgIyBhbnl3YXkuKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZmxvd19sZXZlbDoKKworICAgICAgICAgICAgICAgICMgV2UgYXJlIGFsbG93ZWQgdG8gc3RhcnQgYSBjb21wbGV4IHZhbHVlIGlmIGFuZCBvbmx5IGlmCisgICAgICAgICAgICAgICAgIyB3ZSBjYW4gc3RhcnQgYSBzaW1wbGUga2V5LgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93X3NpbXBsZV9rZXk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXBwaW5nIHZhbHVlcyBhcmUgbm90IGFsbG93ZWQgaGVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorCisgICAgICAgICAgICAjIElmIHRoaXMgdmFsdWUgc3RhcnRzIGEgbmV3IGJsb2NrIG1hcHBpbmcsIHdlIG5lZWQgdG8gYWRkCisgICAgICAgICAgICAjIEJMT0NLLU1BUFBJTkctU1RBUlQuICBJdCB3aWxsIGJlIGRldGVjdGVkIGFzIGFuIGVycm9yIGxhdGVyIGJ5CisgICAgICAgICAgICAjIHRoZSBwYXJzZXIuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYWRkX2luZGVudChzZWxmLmNvbHVtbik6CisgICAgICAgICAgICAgICAgICAgIG1hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4obWFyaywgbWFyaykpCisKKyAgICAgICAgICAgICMgU2ltcGxlIGtleXMgYXJlIGFsbG93ZWQgYWZ0ZXIgJzonIGluIHRoZSBibG9jayBjb250ZXh0LgorICAgICAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gbm90IHNlbGYuZmxvd19sZXZlbAorCisgICAgICAgICAgICAjIFJlc2V0IHBvc3NpYmxlIHNpbXBsZSBrZXkgb24gdGhlIGN1cnJlbnQgbGV2ZWwuCisgICAgICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIEFkZCBWQUxVRS4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoVmFsdWVUb2tlbihzdGFydF9tYXJrLCBlbmRfbWFyaykpCisKKyAgICBkZWYgZmV0Y2hfYWxpYXMoc2VsZik6CisKKyAgICAgICAgIyBBTElBUyBjb3VsZCBiZSBhIHNpbXBsZSBrZXkuCisgICAgICAgIHNlbGYuc2F2ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIE5vIHNpbXBsZSBrZXlzIGFmdGVyIEFMSUFTLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIEFMSUFTLgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2FuY2hvcihBbGlhc1Rva2VuKSkKKworICAgIGRlZiBmZXRjaF9hbmNob3Ioc2VsZik6CisKKyAgICAgICAgIyBBTkNIT1IgY291bGQgc3RhcnQgYSBzaW1wbGUga2V5LgorICAgICAgICBzZWxmLnNhdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBObyBzaW1wbGUga2V5cyBhZnRlciBBTkNIT1IuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IEZhbHNlCisKKyAgICAgICAgIyBTY2FuIGFuZCBhZGQgQU5DSE9SLgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2FuY2hvcihBbmNob3JUb2tlbikpCisKKyAgICBkZWYgZmV0Y2hfdGFnKHNlbGYpOgorCisgICAgICAgICMgVEFHIGNvdWxkIHN0YXJ0IGEgc2ltcGxlIGtleS4KKyAgICAgICAgc2VsZi5zYXZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgTm8gc2ltcGxlIGtleXMgYWZ0ZXIgVEFHLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIFRBRy4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl90YWcoKSkKKworICAgIGRlZiBmZXRjaF9saXRlcmFsKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Jsb2NrX3NjYWxhcihzdHlsZT0nfCcpCisKKyAgICBkZWYgZmV0Y2hfZm9sZGVkKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Jsb2NrX3NjYWxhcihzdHlsZT0nPicpCisKKyAgICBkZWYgZmV0Y2hfYmxvY2tfc2NhbGFyKHNlbGYsIHN0eWxlKToKKworICAgICAgICAjIEEgc2ltcGxlIGtleSBtYXkgZm9sbG93IGEgYmxvY2sgc2NhbGFyLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBUcnVlCisKKyAgICAgICAgIyBSZXNldCBwb3NzaWJsZSBzaW1wbGUga2V5IG9uIHRoZSBjdXJyZW50IGxldmVsLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIFNjYW4gYW5kIGFkZCBTQ0FMQVIuCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fYmxvY2tfc2NhbGFyKHN0eWxlKSkKKworICAgIGRlZiBmZXRjaF9zaW5nbGUoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZmxvd19zY2FsYXIoc3R5bGU9J1wnJykKKworICAgIGRlZiBmZXRjaF9kb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZmxvd19zY2FsYXIoc3R5bGU9JyInKQorCisgICAgZGVmIGZldGNoX2Zsb3dfc2NhbGFyKHNlbGYsIHN0eWxlKToKKworICAgICAgICAjIEEgZmxvdyBzY2FsYXIgY291bGQgYmUgYSBzaW1wbGUga2V5LgorICAgICAgICBzZWxmLnNhdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBObyBzaW1wbGUga2V5cyBhZnRlciBmbG93IHNjYWxhcnMuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IEZhbHNlCisKKyAgICAgICAgIyBTY2FuIGFuZCBhZGQgU0NBTEFSLgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2Zsb3dfc2NhbGFyKHN0eWxlKSkKKworICAgIGRlZiBmZXRjaF9wbGFpbihzZWxmKToKKworICAgICAgICAjIEEgcGxhaW4gc2NhbGFyIGNvdWxkIGJlIGEgc2ltcGxlIGtleS4KKyAgICAgICAgc2VsZi5zYXZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgTm8gc2ltcGxlIGtleXMgYWZ0ZXIgcGxhaW4gc2NhbGFycy4gQnV0IG5vdGUgdGhhdCBgc2Nhbl9wbGFpbmAgd2lsbAorICAgICAgICAjIGNoYW5nZSB0aGlzIGZsYWcgaWYgdGhlIHNjYW4gaXMgZmluaXNoZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAgIyBsaW5lLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIFNDQUxBUi4gTWF5IGNoYW5nZSBgYWxsb3dfc2ltcGxlX2tleWAuCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fcGxhaW4oKSkKKworICAgICMgQ2hlY2tlcnMuCisKKyAgICBkZWYgY2hlY2tfZGlyZWN0aXZlKHNlbGYpOgorCisgICAgICAgICMgRElSRUNUSVZFOiAgICAgICAgXiAnJScgLi4uCisgICAgICAgICMgVGhlICclJyBpbmRpY2F0b3IgaXMgYWxyZWFkeSBjaGVja2VkLgorICAgICAgICBpZiBzZWxmLmNvbHVtbiA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja19kb2N1bWVudF9zdGFydChzZWxmKToKKworICAgICAgICAjIERPQ1VNRU5ULVNUQVJUOiAgIF4gJy0tLScgKCcgJ3wnXG4nKQorICAgICAgICBpZiBzZWxmLmNvbHVtbiA9PSAwOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVmaXgoMykgPT0gdSctLS0nICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsoMykgaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrX2RvY3VtZW50X2VuZChzZWxmKToKKworICAgICAgICAjIERPQ1VNRU5ULUVORDogICAgIF4gJy4uLicgKCcgJ3wnXG4nKQorICAgICAgICBpZiBzZWxmLmNvbHVtbiA9PSAwOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVmaXgoMykgPT0gdScuLi4nICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsoMykgaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrX2Jsb2NrX2VudHJ5KHNlbGYpOgorCisgICAgICAgICMgQkxPQ0stRU5UUlk6ICAgICAgJy0nICgnICd8J1xuJykKKyAgICAgICAgcmV0dXJuIHNlbGYucGVlaygxKSBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknCisKKyAgICBkZWYgY2hlY2tfa2V5KHNlbGYpOgorCisgICAgICAgICMgS0VZKGZsb3cgY29udGV4dCk6ICAgICc/JworICAgICAgICBpZiBzZWxmLmZsb3dfbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgS0VZKGJsb2NrIGNvbnRleHQpOiAgICc/JyAoJyAnfCdcbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wZWVrKDEpIGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOScKKworICAgIGRlZiBjaGVja192YWx1ZShzZWxmKToKKworICAgICAgICAjIFZBTFVFKGZsb3cgY29udGV4dCk6ICAnOicKKyAgICAgICAgaWYgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIFZBTFVFKGJsb2NrIGNvbnRleHQpOiAnOicgKCcgJ3wnXG4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGVlaygxKSBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknCisKKyAgICBkZWYgY2hlY2tfcGxhaW4oc2VsZik6CisKKyAgICAgICAgIyBBIHBsYWluIHNjYWxhciBtYXkgc3RhcnQgd2l0aCBhbnkgbm9uLXNwYWNlIGNoYXJhY3RlciBleGNlcHQ6CisgICAgICAgICMgICAnLScsICc/JywgJzonLCAnLCcsICdbJywgJ10nLCAneycsICd9JywKKyAgICAgICAgIyAgICcjJywgJyYnLCAnKicsICchJywgJ3wnLCAnPicsICdcJycsICdcIicsCisgICAgICAgICMgICAnJScsICdAJywgJ2AnLgorICAgICAgICAjCisgICAgICAgICMgSXQgbWF5IGFsc28gc3RhcnQgd2l0aAorICAgICAgICAjICAgJy0nLCAnPycsICc6JworICAgICAgICAjIGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbm9uLXNwYWNlIGNoYXJhY3Rlci4KKyAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBsaW1pdCB0aGUgbGFzdCBydWxlIHRvIHRoZSBibG9jayBjb250ZXh0IChleGNlcHQgdGhlCisgICAgICAgICMgJy0nIGNoYXJhY3RlcikgYmVjYXVzZSB3ZSB3YW50IHRoZSBmbG93IGNvbnRleHQgdG8gYmUgc3BhY2UKKyAgICAgICAgIyBpbmRlcGVuZGVudC4KKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICByZXR1cm4gY2ggbm90IGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOS0/OixbXXt9IyYqIXw+XCdcIiVAYCcgIFwKKyAgICAgICAgICAgICAgICBvciAoc2VsZi5wZWVrKDEpIG5vdCBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKGNoID09IHUnLScgb3IgKG5vdCBzZWxmLmZsb3dfbGV2ZWwgYW5kIGNoIGluIHUnPzonKSkpCisKKyAgICAjIFNjYW5uZXJzLgorCisgICAgZGVmIHNjYW5fdG9fbmV4dF90b2tlbihzZWxmKToKKyAgICAgICAgIyBXZSBpZ25vcmUgc3BhY2VzLCBsaW5lIGJyZWFrcyBhbmQgY29tbWVudHMuCisgICAgICAgICMgSWYgd2UgZmluZCBhIGxpbmUgYnJlYWsgaW4gdGhlIGJsb2NrIGNvbnRleHQsIHdlIHNldCB0aGUgZmxhZworICAgICAgICAjIGBhbGxvd19zaW1wbGVfa2V5YCBvbi4KKyAgICAgICAgIyBUaGUgYnl0ZSBvcmRlciBtYXJrIGlzIHN0cmlwcGVkIGlmIGl0J3MgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKKyAgICAgICAgIyBzdHJlYW0uIFdlIGRvIG5vdCB5ZXQgc3VwcG9ydCBCT00gaW5zaWRlIHRoZSBzdHJlYW0gYXMgdGhlCisgICAgICAgICMgc3BlY2lmaWNhdGlvbiByZXF1aXJlcy4gQW55IHN1Y2ggbWFyayB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgYSBwYXJ0CisgICAgICAgICMgb2YgdGhlIGRvY3VtZW50LgorICAgICAgICAjCisgICAgICAgICMgVE9ETzogV2UgbmVlZCB0byBtYWtlIHRhYiBoYW5kbGluZyBydWxlcyBtb3JlIHNhbmUuIEEgZ29vZCBydWxlIGlzCisgICAgICAgICMgICBUYWJzIGNhbm5vdCBwcmVjZWRlIHRva2VucworICAgICAgICAjICAgQkxPQ0stU0VRVUVOQ0UtU1RBUlQsIEJMT0NLLU1BUFBJTkctU1RBUlQsIEJMT0NLLUVORCwKKyAgICAgICAgIyAgIEtFWShibG9jayksIFZBTFVFKGJsb2NrKSwgQkxPQ0stRU5UUlkKKyAgICAgICAgIyBTbyB0aGUgY2hlY2tpbmcgY29kZSBpcworICAgICAgICAjICAgaWYgPFRBQj46CisgICAgICAgICMgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5cyA9IEZhbHNlCisgICAgICAgICMgV2UgYWxzbyBuZWVkIHRvIGFkZCB0aGUgY2hlY2sgZm9yIGBhbGxvd19zaW1wbGVfa2V5cyA9PSBUcnVlYCB0bworICAgICAgICAjIGB1bndpbmRfaW5kZW50YCBiZWZvcmUgaXNzdWluZyBCTE9DSy1FTkQuCisgICAgICAgICMgU2Nhbm5lcnMgZm9yIGJsb2NrLCBmbG93LCBhbmQgcGxhaW4gc2NhbGFycyBuZWVkIHRvIGJlIG1vZGlmaWVkLgorCisgICAgICAgIGlmIHNlbGYuaW5kZXggPT0gMCBhbmQgc2VsZi5wZWVrKCkgPT0gdSdcdUZFRkYnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZm91bmQgPSBGYWxzZQorICAgICAgICB3aGlsZSBub3QgZm91bmQ6CisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSA9PSB1JyAnOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICBpZiBzZWxmLnBlZWsoKSA9PSB1JyMnOgorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYucGVlaygpIG5vdCBpbiB1J1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgaWYgc2VsZi5zY2FuX2xpbmVfYnJlYWsoKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorCisgICAgZGVmIHNjYW5fZGlyZWN0aXZlKHNlbGYpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBuYW1lID0gc2VsZi5zY2FuX2RpcmVjdGl2ZV9uYW1lKHN0YXJ0X21hcmspCisgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICBpZiBuYW1lID09IHUnWUFNTCc6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuc2Nhbl95YW1sX2RpcmVjdGl2ZV92YWx1ZShzdGFydF9tYXJrKQorICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgZWxpZiBuYW1lID09IHUnVEFHJzoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5zY2FuX3RhZ19kaXJlY3RpdmVfdmFsdWUoc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgc2VsZi5zY2FuX2RpcmVjdGl2ZV9pZ25vcmVkX2xpbmUoc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIERpcmVjdGl2ZVRva2VuKG5hbWUsIHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyaykKKworICAgIGRlZiBzY2FuX2RpcmVjdGl2ZV9uYW1lKHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIHdoaWxlIHUnMCcgPD0gY2ggPD0gdSc5JyBvciB1J0EnIDw9IGNoIDw9IHUnWicgb3IgdSdhJyA8PSBjaCA8PSB1J3onICAgIFwKKyAgICAgICAgICAgICAgICBvciBjaCBpbiB1Jy1fJzoKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIGlmIG5vdCBsZW5ndGg6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGFscGhhYmV0aWMgb3IgbnVtZXJpYyBjaGFyYWN0ZXIsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBjaC5lbmNvZGUoJ3V0Zi04JyksIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluIHUnXDAgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGRpcmVjdGl2ZSIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhbHBoYWJldGljIG9yIG51bWVyaWMgY2hhcmFjdGVyLCBidXQgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgICAgICUgY2guZW5jb2RlKCd1dGYtOCcpLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIHNjYW5feWFtbF9kaXJlY3RpdmVfdmFsdWUoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSA9PSB1JyAnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgbWFqb3IgPSBzZWxmLnNjYW5feWFtbF9kaXJlY3RpdmVfbnVtYmVyKHN0YXJ0X21hcmspCisgICAgICAgIGlmIHNlbGYucGVlaygpICE9ICcuJzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkaXJlY3RpdmUiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBkaWdpdCBvciAnLicsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLnBlZWsoKS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgbWlub3IgPSBzZWxmLnNjYW5feWFtbF9kaXJlY3RpdmVfbnVtYmVyKHN0YXJ0X21hcmspCisgICAgICAgIGlmIHNlbGYucGVlaygpIG5vdCBpbiB1J1wwIFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkaXJlY3RpdmUiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBkaWdpdCBvciAnICcsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLnBlZWsoKS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpCisKKyAgICBkZWYgc2Nhbl95YW1sX2RpcmVjdGl2ZV9udW1iZXIoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIG5vdCAodScwJyA8PSBjaCA8PSB1JzknKToKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkaXJlY3RpdmUiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBkaWdpdCwgYnV0IGZvdW5kICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICBsZW5ndGggPSAwCisgICAgICAgIHdoaWxlIHUnMCcgPD0gc2VsZi5wZWVrKGxlbmd0aCkgPD0gdSc5JzoKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgIHZhbHVlID0gaW50KHNlbGYucHJlZml4KGxlbmd0aCkpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIHNjYW5fdGFnX2RpcmVjdGl2ZV92YWx1ZShzZWxmLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHdoaWxlIHNlbGYucGVlaygpID09IHUnICc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBoYW5kbGUgPSBzZWxmLnNjYW5fdGFnX2RpcmVjdGl2ZV9oYW5kbGUoc3RhcnRfbWFyaykKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gdScgJzoKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIHByZWZpeCA9IHNlbGYuc2Nhbl90YWdfZGlyZWN0aXZlX3ByZWZpeChzdGFydF9tYXJrKQorICAgICAgICByZXR1cm4gKGhhbmRsZSwgcHJlZml4KQorCisgICAgZGVmIHNjYW5fdGFnX2RpcmVjdGl2ZV9oYW5kbGUoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICB2YWx1ZSA9IHNlbGYuc2Nhbl90YWdfaGFuZGxlKCdkaXJlY3RpdmUnLCBzdGFydF9tYXJrKQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoICE9IHUnICc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICcgJywgYnV0IGZvdW5kICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX3RhZ19kaXJlY3RpdmVfcHJlZml4KHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgdmFsdWUgPSBzZWxmLnNjYW5fdGFnX3VyaSgnZGlyZWN0aXZlJywgc3RhcnRfbWFyaykKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBub3QgaW4gdSdcMCBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICcgJywgYnV0IGZvdW5kICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX2RpcmVjdGl2ZV9pZ25vcmVkX2xpbmUoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSA9PSB1JyAnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgaWYgc2VsZi5wZWVrKCkgPT0gdScjJzoKKyAgICAgICAgICAgIHdoaWxlIHNlbGYucGVlaygpIG5vdCBpbiB1J1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgY29tbWVudCBvciBhIGxpbmUgYnJlYWssIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgY2guZW5jb2RlKCd1dGYtOCcpLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgIHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKworICAgIGRlZiBzY2FuX2FuY2hvcihzZWxmLCBUb2tlbkNsYXNzKToKKyAgICAgICAgIyBUaGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjaGFyYWN0ZXJzIGZvciBhbmNob3JzIGFuZAorICAgICAgICAjIGFsaWFzZXMuIFRoaXMgbWF5IGxlYWQgdG8gcHJvYmxlbXMsIGZvciBpbnN0YW5jZSwgdGhlIGRvY3VtZW50OgorICAgICAgICAjICAgWyAqYWxpYXMsIHZhbHVlIF0KKyAgICAgICAgIyBjYW4gYmUgaW50ZXJwdGV0ZWQgaW4gdHdvIHdheXMsIGFzCisgICAgICAgICMgICBbICJ2YWx1ZSIgXQorICAgICAgICAjIGFuZAorICAgICAgICAjICAgWyAqYWxpYXMgLCAidmFsdWUiIF0KKyAgICAgICAgIyBUaGVyZWZvcmUgd2UgcmVzdHJpY3QgYWxpYXNlcyB0byBudW1iZXJzIGFuZCBBU0NJSSBsZXR0ZXJzLgorICAgICAgICBzdGFydF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIGluZGljYXRvciA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGluZGljYXRvciA9PSB1JyonOgorICAgICAgICAgICAgbmFtZSA9ICdhbGlhcycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAnYW5jaG9yJworICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBsZW5ndGggPSAwCisgICAgICAgIGNoID0gc2VsZi5wZWVrKGxlbmd0aCkKKyAgICAgICAgd2hpbGUgdScwJyA8PSBjaCA8PSB1JzknIG9yIHUnQScgPD0gY2ggPD0gdSdaJyBvciB1J2EnIDw9IGNoIDw9IHUneicgICAgXAorICAgICAgICAgICAgICAgIG9yIGNoIGluIHUnLV8nOgorICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKGxlbmd0aCkKKyAgICAgICAgaWYgbm90IGxlbmd0aDoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYW4gJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGFscGhhYmV0aWMgb3IgbnVtZXJpYyBjaGFyYWN0ZXIsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBjaC5lbmNvZGUoJ3V0Zi04JyksIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOT86LF19JUBgJzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYW4gJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGFscGhhYmV0aWMgb3IgbnVtZXJpYyBjaGFyYWN0ZXIsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBjaC5lbmNvZGUoJ3V0Zi04JyksIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgcmV0dXJuIFRva2VuQ2xhc3ModmFsdWUsIHN0YXJ0X21hcmssIGVuZF9tYXJrKQorCisgICAgZGVmIHNjYW5fdGFnKHNlbGYpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBjaCA9IHNlbGYucGVlaygxKQorICAgICAgICBpZiBjaCA9PSB1JzwnOgorICAgICAgICAgICAgaGFuZGxlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKDIpCisgICAgICAgICAgICBzdWZmaXggPSBzZWxmLnNjYW5fdGFnX3VyaSgndGFnJywgc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGlmIHNlbGYucGVlaygpICE9IHUnPic6CisgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgdGFnIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnPicsIGJ1dCBmb3VuZCAlciIgJSBzZWxmLnBlZWsoKS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbGlmIGNoIGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBoYW5kbGUgPSBOb25lCisgICAgICAgICAgICBzdWZmaXggPSB1JyEnCisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGVuZ3RoID0gMQorICAgICAgICAgICAgdXNlX2hhbmRsZSA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBjaCBub3QgaW4gdSdcMCBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgaWYgY2ggPT0gdSchJzoKKyAgICAgICAgICAgICAgICAgICAgdXNlX2hhbmRsZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKGxlbmd0aCkKKyAgICAgICAgICAgIGhhbmRsZSA9IHUnIScKKyAgICAgICAgICAgIGlmIHVzZV9oYW5kbGU6CisgICAgICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5zY2FuX3RhZ19oYW5kbGUoJ3RhZycsIHN0YXJ0X21hcmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhhbmRsZSA9IHUnIScKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgc3VmZml4ID0gc2VsZi5zY2FuX3RhZ191cmkoJ3RhZycsIHN0YXJ0X21hcmspCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluIHUnXDAgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIHRhZyIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnICcsIGJ1dCBmb3VuZCAlciIgJSBjaC5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgdmFsdWUgPSAoaGFuZGxlLCBzdWZmaXgpCisgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHJldHVybiBUYWdUb2tlbih2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspCisKKyAgICBkZWYgc2Nhbl9ibG9ja19zY2FsYXIoc2VsZiwgc3R5bGUpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKworICAgICAgICBpZiBzdHlsZSA9PSAnPic6CisgICAgICAgICAgICBmb2xkZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb2xkZWQgPSBGYWxzZQorCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKworICAgICAgICAjIFNjYW4gdGhlIGhlYWRlci4KKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgY2hvbXBpbmcsIGluY3JlbWVudCA9IHNlbGYuc2Nhbl9ibG9ja19zY2FsYXJfaW5kaWNhdG9ycyhzdGFydF9tYXJrKQorICAgICAgICBzZWxmLnNjYW5fYmxvY2tfc2NhbGFyX2lnbm9yZWRfbGluZShzdGFydF9tYXJrKQorCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgZ28gdG8gdGhlIGZpcnN0IG5vbi1lbXB0eSBsaW5lLgorICAgICAgICBtaW5faW5kZW50ID0gc2VsZi5pbmRlbnQrMQorICAgICAgICBpZiBtaW5faW5kZW50IDwgMToKKyAgICAgICAgICAgIG1pbl9pbmRlbnQgPSAxCisgICAgICAgIGlmIGluY3JlbWVudCBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWtzLCBtYXhfaW5kZW50LCBlbmRfbWFyayA9IHNlbGYuc2Nhbl9ibG9ja19zY2FsYXJfaW5kZW50YXRpb24oKQorICAgICAgICAgICAgaW5kZW50ID0gbWF4KG1pbl9pbmRlbnQsIG1heF9pbmRlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRlbnQgPSBtaW5faW5kZW50K2luY3JlbWVudC0xCisgICAgICAgICAgICBicmVha3MsIGVuZF9tYXJrID0gc2VsZi5zY2FuX2Jsb2NrX3NjYWxhcl9icmVha3MoaW5kZW50KQorICAgICAgICBsaW5lX2JyZWFrID0gdScnCisKKyAgICAgICAgIyBTY2FuIHRoZSBpbm5lciBwYXJ0IG9mIHRoZSBibG9jayBzY2FsYXIuCisgICAgICAgIHdoaWxlIHNlbGYuY29sdW1uID09IGluZGVudCBhbmQgc2VsZi5wZWVrKCkgIT0gdSdcMCc6CisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKGJyZWFrcykKKyAgICAgICAgICAgIGxlYWRpbmdfbm9uX3NwYWNlID0gc2VsZi5wZWVrKCkgbm90IGluIHUnIFx0JworICAgICAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKGxlbmd0aCkgbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5wcmVmaXgobGVuZ3RoKSkKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgICAgICBsaW5lX2JyZWFrID0gc2VsZi5zY2FuX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgYnJlYWtzLCBlbmRfbWFyayA9IHNlbGYuc2Nhbl9ibG9ja19zY2FsYXJfYnJlYWtzKGluZGVudCkKKyAgICAgICAgICAgIGlmIHNlbGYuY29sdW1uID09IGluZGVudCBhbmQgc2VsZi5wZWVrKCkgIT0gdSdcMCc6CisKKyAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHksIGZvbGRpbmcgcnVsZXMgYXJlIGFtYmlndW91cy4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBmb2xkaW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBmb2xkZWQgYW5kIGxpbmVfYnJlYWsgPT0gdSdcbicgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGVhZGluZ19ub25fc3BhY2UgYW5kIHNlbGYucGVlaygpIG5vdCBpbiB1JyBcdCc6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBicmVha3M6CisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHUnICcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChsaW5lX2JyZWFrKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBDbGFyayBFdmFucydzIGludGVycHJldGF0aW9uIChhbHNvIGluIHRoZSBzcGVjCisgICAgICAgICAgICAgICAgIyBleGFtcGxlcyk6CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICNpZiBmb2xkZWQgYW5kIGxpbmVfYnJlYWsgPT0gdSdcbic6CisgICAgICAgICAgICAgICAgIyAgICBpZiBub3QgYnJlYWtzOgorICAgICAgICAgICAgICAgICMgICAgICAgIGlmIHNlbGYucGVlaygpIG5vdCBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAjICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCh1JyAnKQorICAgICAgICAgICAgICAgICMgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgICAgICAgICAjZWxzZToKKyAgICAgICAgICAgICAgICAjICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIENob21wIHRoZSB0YWlsLgorICAgICAgICBpZiBjaG9tcGluZyBpcyBub3QgRmFsc2U6CisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGxpbmVfYnJlYWspCisgICAgICAgIGlmIGNob21waW5nIGlzIFRydWU6CisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKGJyZWFrcykKKworICAgICAgICAjIFdlIGFyZSBkb25lLgorICAgICAgICByZXR1cm4gU2NhbGFyVG9rZW4odScnLmpvaW4oY2h1bmtzKSwgRmFsc2UsIHN0YXJ0X21hcmssIGVuZF9tYXJrLAorICAgICAgICAgICAgICAgIHN0eWxlKQorCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2luZGljYXRvcnMoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBjaG9tcGluZyA9IE5vbmUKKyAgICAgICAgaW5jcmVtZW50ID0gTm9uZQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoIGluIHUnKy0nOgorICAgICAgICAgICAgaWYgY2ggPT0gJysnOgorICAgICAgICAgICAgICAgIGNob21waW5nID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjaG9tcGluZyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICAgICAgaWYgY2ggaW4gdScwMTIzNDU2Nzg5JzoKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSBpbnQoY2gpCisgICAgICAgICAgICAgICAgaWYgaW5jcmVtZW50ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBibG9jayBzY2FsYXIiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgaW4gdGhlIHJhbmdlIDEtOSwgYnV0IGZvdW5kIDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbGlmIGNoIGluIHUnMDEyMzQ1Njc4OSc6CisgICAgICAgICAgICBpbmNyZW1lbnQgPSBpbnQoY2gpCisgICAgICAgICAgICBpZiBpbmNyZW1lbnQgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgYmxvY2sgc2NhbGFyIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgaW4gdGhlIHJhbmdlIDEtOSwgYnV0IGZvdW5kIDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgICAgIGlmIGNoIGluIHUnKy0nOgorICAgICAgICAgICAgICAgIGlmIGNoID09ICcrJzoKKyAgICAgICAgICAgICAgICAgICAgY2hvbXBpbmcgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2hvbXBpbmcgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluIHUnXDAgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGJsb2NrIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBjaG9tcGluZyBvciBpbmRlbnRhdGlvbiBpbmRpY2F0b3JzLCBidXQgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIGNoLmVuY29kZSgndXRmLTgnKSwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gY2hvbXBpbmcsIGluY3JlbWVudAorCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2lnbm9yZWRfbGluZShzZWxmLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHdoaWxlIHNlbGYucGVlaygpID09IHUnICc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBpZiBzZWxmLnBlZWsoKSA9PSB1JyMnOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgbm90IGluIHUnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBub3QgaW4gdSdcMFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBibG9jayBzY2FsYXIiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBjb21tZW50IG9yIGEgbGluZSBicmVhaywgYnV0IGZvdW5kICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBjaC5lbmNvZGUoJ3V0Zi04JyksIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgc2VsZi5zY2FuX2xpbmVfYnJlYWsoKQorCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2luZGVudGF0aW9uKHNlbGYpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbWF4X2luZGVudCA9IDAKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgaW4gdScgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgaWYgc2VsZi5wZWVrKCkgIT0gdScgJzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkpCisgICAgICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbHVtbiA+IG1heF9pbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIG1heF9pbmRlbnQgPSBzZWxmLmNvbHVtbgorICAgICAgICByZXR1cm4gY2h1bmtzLCBtYXhfaW5kZW50LCBlbmRfbWFyaworCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2JyZWFrcyhzZWxmLCBpbmRlbnQpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgd2hpbGUgc2VsZi5jb2x1bW4gPCBpbmRlbnQgYW5kIHNlbGYucGVlaygpID09IHUnICc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSBpbiB1J1xyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5zY2FuX2xpbmVfYnJlYWsoKSkKKyAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICB3aGlsZSBzZWxmLmNvbHVtbiA8IGluZGVudCBhbmQgc2VsZi5wZWVrKCkgPT0gdScgJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICByZXR1cm4gY2h1bmtzLCBlbmRfbWFyaworCisgICAgZGVmIHNjYW5fZmxvd19zY2FsYXIoc2VsZiwgc3R5bGUpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgIyBOb3RlIHRoYXQgd2UgbG9vc2UgaW5kZW50YXRpb24gcnVsZXMgZm9yIHF1b3RlZCBzY2FsYXJzLiBRdW90ZWQKKyAgICAgICAgIyBzY2FsYXJzIGRvbid0IG5lZWQgdG8gYWRoZXJlIGluZGVudGF0aW9uIGJlY2F1c2UgIiBhbmQgJyBjbGVhcmx5CisgICAgICAgICMgbWFyayB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZW0uIFRoZXJlZm9yZSB3ZSBhcmUgbGVzcworICAgICAgICAjIHJlc3RyaWN0aXZlIHRoZW4gdGhlIHNwZWNpZmljYXRpb24gcmVxdWlyZXMuIFdlIG9ubHkgbmVlZCB0byBjaGVjaworICAgICAgICAjIHRoYXQgZG9jdW1lbnQgc2VwYXJhdG9ycyBhcmUgbm90IGluY2x1ZGVkIGluIHNjYWxhcnMuCisgICAgICAgIGlmIHN0eWxlID09ICciJzoKKyAgICAgICAgICAgIGRvdWJsZSA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvdWJsZSA9IEZhbHNlCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgcXVvdGUgPSBzZWxmLnBlZWsoKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBjaHVua3MuZXh0ZW5kKHNlbGYuc2Nhbl9mbG93X3NjYWxhcl9ub25fc3BhY2VzKGRvdWJsZSwgc3RhcnRfbWFyaykpCisgICAgICAgIHdoaWxlIHNlbGYucGVlaygpICE9IHF1b3RlOgorICAgICAgICAgICAgY2h1bmtzLmV4dGVuZChzZWxmLnNjYW5fZmxvd19zY2FsYXJfc3BhY2VzKGRvdWJsZSwgc3RhcnRfbWFyaykpCisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKHNlbGYuc2Nhbl9mbG93X3NjYWxhcl9ub25fc3BhY2VzKGRvdWJsZSwgc3RhcnRfbWFyaykpCisgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHJldHVybiBTY2FsYXJUb2tlbih1Jycuam9pbihjaHVua3MpLCBGYWxzZSwgc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgc3R5bGUpCisKKyAgICBFU0NBUEVfUkVQTEFDRU1FTlRTID0geworICAgICAgICB1JzAnOiAgIHUnXDAnLAorICAgICAgICB1J2EnOiAgIHUnXHgwNycsCisgICAgICAgIHUnYic6ICAgdSdceDA4JywKKyAgICAgICAgdSd0JzogICB1J1x4MDknLAorICAgICAgICB1J1x0JzogIHUnXHgwOScsCisgICAgICAgIHUnbic6ICAgdSdceDBBJywKKyAgICAgICAgdSd2JzogICB1J1x4MEInLAorICAgICAgICB1J2YnOiAgIHUnXHgwQycsCisgICAgICAgIHUncic6ICAgdSdceDBEJywKKyAgICAgICAgdSdlJzogICB1J1x4MUInLAorICAgICAgICB1JyAnOiAgIHUnXHgyMCcsCisgICAgICAgIHUnXCInOiAgdSdcIicsCisgICAgICAgIHUnXFwnOiAgdSdcXCcsCisgICAgICAgIHUnTic6ICAgdSdceDg1JywKKyAgICAgICAgdSdfJzogICB1J1x4QTAnLAorICAgICAgICB1J0wnOiAgIHUnXHUyMDI4JywKKyAgICAgICAgdSdQJzogICB1J1x1MjAyOScsCisgICAgfQorCisgICAgRVNDQVBFX0NPREVTID0geworICAgICAgICB1J3gnOiAgIDIsCisgICAgICAgIHUndSc6ICAgNCwKKyAgICAgICAgdSdVJzogICA4LAorICAgIH0KKworICAgIGRlZiBzY2FuX2Zsb3dfc2NhbGFyX25vbl9zcGFjZXMoc2VsZiwgZG91YmxlLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsZW5ndGggPSAwCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsobGVuZ3RoKSBub3QgaW4gdSdcJ1wiXFxcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgaWYgbGVuZ3RoOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5wcmVmaXgobGVuZ3RoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICAgICAgaWYgbm90IGRvdWJsZSBhbmQgY2ggPT0gdSdcJycgYW5kIHNlbGYucGVlaygxKSA9PSB1J1wnJzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHUnXCcnKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgyKQorICAgICAgICAgICAgZWxpZiAoZG91YmxlIGFuZCBjaCA9PSB1J1wnJykgb3IgKG5vdCBkb3VibGUgYW5kIGNoIGluIHUnXCJcXCcpOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoY2gpCisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIGVsaWYgZG91YmxlIGFuZCBjaCA9PSB1J1xcJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgICAgICAgICBpZiBjaCBpbiBzZWxmLkVTQ0FQRV9SRVBMQUNFTUVOVFM6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5FU0NBUEVfUkVQTEFDRU1FTlRTW2NoXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoIGluIHNlbGYuRVNDQVBFX0NPREVTOgorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLkVTQ0FQRV9DT0RFU1tjaF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UobGVuZ3RoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGVlayhrKSBub3QgaW4gdScwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZG91YmxlLXF1b3RlZCBzY2FsYXIiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZSBvZiAlZCBoZXhkZWNpbWFsIG51bWJlcnMsIGJ1dCBmb3VuZCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGgsIHNlbGYucGVlayhrKS5lbmNvZGUoJ3V0Zi04JykpLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBpbnQoc2VsZi5wcmVmaXgobGVuZ3RoKSwgMTYpCisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQodW5pY2hyKGNvZGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgICAgIGVsaWYgY2ggaW4gdSdcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmV4dGVuZChzZWxmLnNjYW5fZmxvd19zY2FsYXJfYnJlYWtzKGRvdWJsZSwgc3RhcnRfbWFyaykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGRvdWJsZS1xdW90ZWQgc2NhbGFyIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5rbm93biBlc2NhcGUgY2hhcmFjdGVyICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtzCisKKyAgICBkZWYgc2Nhbl9mbG93X3NjYWxhcl9zcGFjZXMoc2VsZiwgZG91YmxlLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIGxlbmd0aCA9IDAKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKGxlbmd0aCkgaW4gdScgXHQnOgorICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgd2hpdGVzcGFjZXMgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggPT0gdSdcMCc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgcXVvdGVkIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgIGVsaWYgY2ggaW4gdSdcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBsaW5lX2JyZWFrID0gc2VsZi5zY2FuX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgYnJlYWtzID0gc2VsZi5zY2FuX2Zsb3dfc2NhbGFyX2JyZWFrcyhkb3VibGUsIHN0YXJ0X21hcmspCisgICAgICAgICAgICBpZiBsaW5lX2JyZWFrICE9IHUnXG4nOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgICAgIGVsaWYgbm90IGJyZWFrczoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHUnICcpCisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKGJyZWFrcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQod2hpdGVzcGFjZXMpCisgICAgICAgIHJldHVybiBjaHVua3MKKworICAgIGRlZiBzY2FuX2Zsb3dfc2NhbGFyX2JyZWFrcyhzZWxmLCBkb3VibGUsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgSW5zdGVhZCBvZiBjaGVja2luZyBpbmRlbnRhdGlvbiwgd2UgY2hlY2sgZm9yIGRvY3VtZW50CisgICAgICAgICAgICAjIHNlcGFyYXRvcnMuCisgICAgICAgICAgICBwcmVmaXggPSBzZWxmLnByZWZpeCgzKQorICAgICAgICAgICAgaWYgKHByZWZpeCA9PSB1Jy0tLScgb3IgcHJlZml4ID09IHUnLi4uJykgICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsoMykgaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgcXVvdGVkIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5leHBlY3RlZCBkb2N1bWVudCBzZXBhcmF0b3IiLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSBpbiB1JyBcdCc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIGlmIHNlbGYucGVlaygpIGluIHUnXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5zY2FuX2xpbmVfYnJlYWsoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcworCisgICAgZGVmIHNjYW5fcGxhaW4oc2VsZik6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICAjIFdlIGFkZCBhbiBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIGZvciB0aGUgZmxvdyBjb250ZXh0OgorICAgICAgICAjICAgcGxhaW4gc2NhbGFycyBpbiB0aGUgZmxvdyBjb250ZXh0IGNhbm5vdCBjb250YWluICcsJywgJzonIGFuZCAnPycuCisgICAgICAgICMgV2UgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBgYWxsb3dfc2ltcGxlX2tleWAgZmxhZyBoZXJlLgorICAgICAgICAjIEluZGVudGF0aW9uIHJ1bGVzIGFyZSBsb29zZWQgZm9yIHRoZSBmbG93IGNvbnRleHQuCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgZW5kX21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIGluZGVudCA9IHNlbGYuaW5kZW50KzEKKyAgICAgICAgIyBXZSBhbGxvdyB6ZXJvIGluZGVudGF0aW9uIGZvciBzY2FsYXJzLCBidXQgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGZvcgorICAgICAgICAjIGRvY3VtZW50IHNlcGFyYXRvcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KKyAgICAgICAgI2lmIGluZGVudCA9PSAwOgorICAgICAgICAjICAgIGluZGVudCA9IDEKKyAgICAgICAgc3BhY2VzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxlbmd0aCA9IDAKKyAgICAgICAgICAgIGlmIHNlbGYucGVlaygpID09IHUnIyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsobGVuZ3RoKQorICAgICAgICAgICAgICAgIGlmIGNoIGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOScgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBvciAobm90IHNlbGYuZmxvd19sZXZlbCBhbmQgY2ggPT0gdSc6JyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wZWVrKGxlbmd0aCsxKSBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBvciAoc2VsZi5mbG93X2xldmVsIGFuZCBjaCBpbiB1Jyw6P1tde30nKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgIyBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCBkbyB3aXRoICc6JyBpbiB0aGUgZmxvdyBjb250ZXh0LgorICAgICAgICAgICAgaWYgKHNlbGYuZmxvd19sZXZlbCBhbmQgY2ggPT0gdSc6JworICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5wZWVrKGxlbmd0aCsxKSBub3QgaW4gdSdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5LFtde30nKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBwbGFpbiBzY2FsYXIiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5leHBlY3RlZCAnOiciLCBzZWxmLmdldF9tYXJrKCksCisgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgaHR0cDovL3B5eWFtbC5vcmcvd2lraS9ZQU1MQ29sb25JbkZsb3dDb250ZXh0IGZvciBkZXRhaWxzLiIpCisgICAgICAgICAgICBpZiBsZW5ndGggPT0gMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKyAgICAgICAgICAgIGNodW5rcy5leHRlbmQoc3BhY2VzKQorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLnByZWZpeChsZW5ndGgpKQorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICBzcGFjZXMgPSBzZWxmLnNjYW5fcGxhaW5fc3BhY2VzKGluZGVudCwgc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGlmIG5vdCBzcGFjZXMgb3Igc2VsZi5wZWVrKCkgPT0gdScjJyBcCisgICAgICAgICAgICAgICAgICAgIG9yIChub3Qgc2VsZi5mbG93X2xldmVsIGFuZCBzZWxmLmNvbHVtbiA8IGluZGVudCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFNjYWxhclRva2VuKHUnJy5qb2luKGNodW5rcyksIFRydWUsIHN0YXJ0X21hcmssIGVuZF9tYXJrKQorCisgICAgZGVmIHNjYW5fcGxhaW5fc3BhY2VzKHNlbGYsIGluZGVudCwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICAjIFRoZSBzcGVjaWZpY2F0aW9uIGlzIHJlYWxseSBjb25mdXNpbmcgYWJvdXQgdGFicyBpbiBwbGFpbiBzY2FsYXJzLgorICAgICAgICAjIFdlIGp1c3QgZm9yYmlkIHRoZW0gY29tcGxldGVseS4gRG8gbm90IHVzZSB0YWJzIGluIFlBTUwhCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIGxlbmd0aCA9IDAKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKGxlbmd0aCkgaW4gdScgJzoKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgIHdoaXRlc3BhY2VzID0gc2VsZi5wcmVmaXgobGVuZ3RoKQorICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoIGluIHUnXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgbGluZV9icmVhayA9IHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IFRydWUKKyAgICAgICAgICAgIHByZWZpeCA9IHNlbGYucHJlZml4KDMpCisgICAgICAgICAgICBpZiAocHJlZml4ID09IHUnLS0tJyBvciBwcmVmaXggPT0gdScuLi4nKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYucGVlaygzKSBpbiB1J1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYnJlYWtzID0gW10KKyAgICAgICAgICAgIHdoaWxlIHNlbGYucGVlaygpIGluIHUnIFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBlZWsoKSA9PSAnICc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtzLmFwcGVuZChzZWxmLnNjYW5fbGluZV9icmVhaygpKQorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBzZWxmLnByZWZpeCgzKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IHUnLS0tJyBvciBwcmVmaXggPT0gdScuLi4nKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5wZWVrKDMpIGluIHUnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGxpbmVfYnJlYWsgIT0gdSdcbic6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChsaW5lX2JyZWFrKQorICAgICAgICAgICAgZWxpZiBub3QgYnJlYWtzOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQodScgJykKKyAgICAgICAgICAgIGNodW5rcy5leHRlbmQoYnJlYWtzKQorICAgICAgICBlbGlmIHdoaXRlc3BhY2VzOgorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCh3aGl0ZXNwYWNlcykKKyAgICAgICAgcmV0dXJuIGNodW5rcworCisgICAgZGVmIHNjYW5fdGFnX2hhbmRsZShzZWxmLCBuYW1lLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgRm9yIHNvbWUgc3RyYW5nZSByZWFzb25zLCB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAnXycgaW4KKyAgICAgICAgIyB0YWcgaGFuZGxlcy4gSSBoYXZlIGFsbG93ZWQgaXQgYW55d2F5LgorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoICE9IHUnISc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICchJywgYnV0IGZvdW5kICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICBsZW5ndGggPSAxCisgICAgICAgIGNoID0gc2VsZi5wZWVrKGxlbmd0aCkKKyAgICAgICAgaWYgY2ggIT0gdScgJzoKKyAgICAgICAgICAgIHdoaWxlIHUnMCcgPD0gY2ggPD0gdSc5JyBvciB1J0EnIDw9IGNoIDw9IHUnWicgb3IgdSdhJyA8PSBjaCA8PSB1J3onICAgIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gdSctXyc6CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgICAgICBpZiBjaCAhPSB1JyEnOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhICVzIiAlIG5hbWUsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJyEnLCBidXQgZm91bmQgJXIiICUgY2guZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIHNjYW5fdGFnX3VyaShzZWxmLCBuYW1lLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgTm90ZTogd2UgZG8gbm90IGNoZWNrIGlmIFVSSSBpcyB3ZWxsLWZvcm1lZC4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIHdoaWxlIHUnMCcgPD0gY2ggPD0gdSc5JyBvciB1J0EnIDw9IGNoIDw9IHUnWicgb3IgdSdhJyA8PSBjaCA8PSB1J3onICAgIFwKKyAgICAgICAgICAgICAgICBvciBjaCBpbiB1Jy07Lz86QCY9KyQsXy4hfipcJygpW10lJzoKKyAgICAgICAgICAgIGlmIGNoID09IHUnJSc6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLnByZWZpeChsZW5ndGgpKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5zY2FuX3VyaV9lc2NhcGVzKG5hbWUsIHN0YXJ0X21hcmspKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsobGVuZ3RoKQorICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYucHJlZml4KGxlbmd0aCkpCisgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBpZiBub3QgY2h1bmtzOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIFVSSSwgYnV0IGZvdW5kICVyIiAlIGNoLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gdScnLmpvaW4oY2h1bmtzKQorCisgICAgZGVmIHNjYW5fdXJpX2VzY2FwZXMoc2VsZiwgbmFtZSwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBieXRlcyA9IFtdCisgICAgICAgIG1hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gdSclJzoKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSgyKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBlZWsoaykgbm90IGluIHUnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZic6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSAlcyIgJSBuYW1lLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBVUkkgZXNjYXBlIHNlcXVlbmNlIG9mIDIgaGV4ZGVjaW1hbCBudW1iZXJzLCBidXQgZm91bmQgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYucGVlayhrKS5lbmNvZGUoJ3V0Zi04JykpLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICBieXRlcy5hcHBlbmQoY2hyKGludChzZWxmLnByZWZpeCgyKSwgMTYpKSkKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGUoJycuam9pbihieXRlcyksICd1dGYtOCcpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSAlcyIgJSBuYW1lLCBzdGFydF9tYXJrLCBzdHIoZXhjKSwgbWFyaykKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgc2Nhbl9saW5lX2JyZWFrKHNlbGYpOgorICAgICAgICAjIFRyYW5zZm9ybXM6CisgICAgICAgICMgICAnXHJcbicgICAgICA6ICAgJ1xuJworICAgICAgICAjICAgJ1xyJyAgICAgICAgOiAgICdcbicKKyAgICAgICAgIyAgICdcbicgICAgICAgIDogICAnXG4nCisgICAgICAgICMgICAnXHg4NScgICAgICA6ICAgJ1xuJworICAgICAgICAjICAgJ1x1MjAyOCcgICAgOiAgICdcdTIwMjgnCisgICAgICAgICMgICAnXHUyMDI5ICAgICA6ICAgJ1x1MjAyOScKKyAgICAgICAgIyAgIGRlZmF1bHQgICAgIDogICAnJworICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoIGluIHUnXHJcblx4ODUnOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVmaXgoMikgPT0gdSdcclxuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoMikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIHJldHVybiB1J1xuJworICAgICAgICBlbGlmIGNoIGluIHUnXHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICByZXR1cm4gY2gKKyAgICAgICAgcmV0dXJuIHUnJworCisjdHJ5OgorIyAgICBpbXBvcnQgcHN5Y28KKyMgICAgcHN5Y28uYmluZChTY2FubmVyKQorI2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyMgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIveWFtbC9zZXJpYWxpemVyLnB5IGIvbGliL3lhbWwvc2VyaWFsaXplci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmYxZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvc2VyaWFsaXplci5weQpAQCAtMCwwICsxLDExMSBAQAorCitfX2FsbF9fID0gWydTZXJpYWxpemVyJywgJ1NlcmlhbGl6ZXJFcnJvciddCisKK2Zyb20gZXJyb3IgaW1wb3J0IFlBTUxFcnJvcgorZnJvbSBldmVudHMgaW1wb3J0ICoKK2Zyb20gbm9kZXMgaW1wb3J0ICoKKworY2xhc3MgU2VyaWFsaXplckVycm9yKFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBTZXJpYWxpemVyKG9iamVjdCk6CisKKyAgICBBTkNIT1JfVEVNUExBVEUgPSB1J2lkJTAzZCcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgc2VsZi51c2VfZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLnVzZV9leHBsaWNpdF9zdGFydCA9IGV4cGxpY2l0X3N0YXJ0CisgICAgICAgIHNlbGYudXNlX2V4cGxpY2l0X2VuZCA9IGV4cGxpY2l0X2VuZAorICAgICAgICBzZWxmLnVzZV92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLnVzZV90YWdzID0gdGFncworICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXMgPSB7fQorICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorICAgICAgICBzZWxmLmxhc3RfYW5jaG9yX2lkID0gMAorICAgICAgICBzZWxmLmNsb3NlZCA9IE5vbmUKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KFN0cmVhbVN0YXJ0RXZlbnQoZW5jb2Rpbmc9c2VsZi51c2VfZW5jb2RpbmcpKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBlbGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKCJzZXJpYWxpemVyIGlzIGNsb3NlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgYWxyZWFkeSBvcGVuZWQiKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKCJzZXJpYWxpemVyIGlzIG5vdCBvcGVuZWQiKQorICAgICAgICBlbGlmIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuZW1pdChTdHJlYW1FbmRFdmVudCgpKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICAjZGVmIF9fZGVsX18oc2VsZik6CisgICAgIyAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBzZXJpYWxpemUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgbm90IG9wZW5lZCIpCisgICAgICAgIGVsaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgY2xvc2VkIikKKyAgICAgICAgc2VsZi5lbWl0KERvY3VtZW50U3RhcnRFdmVudChleHBsaWNpdD1zZWxmLnVzZV9leHBsaWNpdF9zdGFydCwKKyAgICAgICAgICAgIHZlcnNpb249c2VsZi51c2VfdmVyc2lvbiwgdGFncz1zZWxmLnVzZV90YWdzKSkKKyAgICAgICAgc2VsZi5hbmNob3Jfbm9kZShub2RlKQorICAgICAgICBzZWxmLnNlcmlhbGl6ZV9ub2RlKG5vZGUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuZW1pdChEb2N1bWVudEVuZEV2ZW50KGV4cGxpY2l0PXNlbGYudXNlX2V4cGxpY2l0X2VuZCkpCisgICAgICAgIHNlbGYuc2VyaWFsaXplZF9ub2RlcyA9IHt9CisgICAgICAgIHNlbGYuYW5jaG9ycyA9IHt9CisgICAgICAgIHNlbGYubGFzdF9hbmNob3JfaWQgPSAwCisKKyAgICBkZWYgYW5jaG9yX25vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUgaW4gc2VsZi5hbmNob3JzOgorICAgICAgICAgICAgaWYgc2VsZi5hbmNob3JzW25vZGVdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hbmNob3JzW25vZGVdID0gc2VsZi5nZW5lcmF0ZV9hbmNob3Iobm9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yc1tub2RlXSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFuY2hvcl9ub2RlKGl0ZW0pCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYW5jaG9yX25vZGUoa2V5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFuY2hvcl9ub2RlKHZhbHVlKQorCisgICAgZGVmIGdlbmVyYXRlX2FuY2hvcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5sYXN0X2FuY2hvcl9pZCArPSAxCisgICAgICAgIHJldHVybiBzZWxmLkFOQ0hPUl9URU1QTEFURSAlIHNlbGYubGFzdF9hbmNob3JfaWQKKworICAgIGRlZiBzZXJpYWxpemVfbm9kZShzZWxmLCBub2RlLCBwYXJlbnQsIGluZGV4KToKKyAgICAgICAgYWxpYXMgPSBzZWxmLmFuY2hvcnNbbm9kZV0KKyAgICAgICAgaWYgbm9kZSBpbiBzZWxmLnNlcmlhbGl6ZWRfbm9kZXM6CisgICAgICAgICAgICBzZWxmLmVtaXQoQWxpYXNFdmVudChhbGlhcykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXNbbm9kZV0gPSBUcnVlCisgICAgICAgICAgICBzZWxmLmRlc2NlbmRfcmVzb2x2ZXIocGFyZW50LCBpbmRleCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU2NhbGFyTm9kZSk6CisgICAgICAgICAgICAgICAgZGV0ZWN0ZWRfdGFnID0gc2VsZi5yZXNvbHZlKFNjYWxhck5vZGUsIG5vZGUudmFsdWUsIChUcnVlLCBGYWxzZSkpCisgICAgICAgICAgICAgICAgZGVmYXVsdF90YWcgPSBzZWxmLnJlc29sdmUoU2NhbGFyTm9kZSwgbm9kZS52YWx1ZSwgKEZhbHNlLCBUcnVlKSkKKyAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IChub2RlLnRhZyA9PSBkZXRlY3RlZF90YWcpLCAobm9kZS50YWcgPT0gZGVmYXVsdF90YWcpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFNjYWxhckV2ZW50KGFsaWFzLCBub2RlLnRhZywgaW1wbGljaXQsIG5vZGUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPW5vZGUuc3R5bGUpKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAobm9kZS50YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBzZWxmLnJlc29sdmUoU2VxdWVuY2VOb2RlLCBub2RlLnZhbHVlLCBUcnVlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoU2VxdWVuY2VTdGFydEV2ZW50KGFsaWFzLCBub2RlLnRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgIGZsb3dfc3R5bGU9bm9kZS5mbG93X3N0eWxlKSkKKyAgICAgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZV9ub2RlKGl0ZW0sIG5vZGUsIGluZGV4KQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFNlcXVlbmNlRW5kRXZlbnQoKSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAobm9kZS50YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBzZWxmLnJlc29sdmUoTWFwcGluZ05vZGUsIG5vZGUudmFsdWUsIFRydWUpKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChNYXBwaW5nU3RhcnRFdmVudChhbGlhcywgbm9kZS50YWcsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICBmbG93X3N0eWxlPW5vZGUuZmxvd19zdHlsZSkpCisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVfbm9kZShrZXksIG5vZGUsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplX25vZGUodmFsdWUsIG5vZGUsIGtleSkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoTWFwcGluZ0VuZEV2ZW50KCkpCisgICAgICAgICAgICBzZWxmLmFzY2VuZF9yZXNvbHZlcigpCisKZGlmZiAtLWdpdCBhL2xpYi95YW1sL3Rva2Vucy5weSBiL2xpYi95YW1sL3Rva2Vucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBiNDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3lhbWwvdG9rZW5zLnB5CkBAIC0wLDAgKzEsMTA0IEBACisKK2NsYXNzIFRva2VuKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcmssIGVuZF9tYXJrKToKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGF0dHJpYnV0ZXMgPSBba2V5IGZvciBrZXkgaW4gc2VsZi5fX2RpY3RfXworICAgICAgICAgICAgICAgIGlmIG5vdCBrZXkuZW5kc3dpdGgoJ19tYXJrJyldCisgICAgICAgIGF0dHJpYnV0ZXMuc29ydCgpCisgICAgICAgIGFyZ3VtZW50cyA9ICcsICcuam9pbihbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGF0dHJpYnV0ZXNdKQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGFyZ3VtZW50cykKKworI2NsYXNzIEJPTVRva2VuKFRva2VuKToKKyMgICAgaWQgPSAnPGJ5dGUgb3JkZXIgbWFyaz4nCisKK2NsYXNzIERpcmVjdGl2ZVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZGlyZWN0aXZlPicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdmFsdWUsIHN0YXJ0X21hcmssIGVuZF9tYXJrKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgRG9jdW1lbnRTdGFydFRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZG9jdW1lbnQgc3RhcnQ+JworCitjbGFzcyBEb2N1bWVudEVuZFRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZG9jdW1lbnQgZW5kPicKKworY2xhc3MgU3RyZWFtU3RhcnRUb2tlbihUb2tlbik6CisgICAgaWQgPSAnPHN0cmVhbSBzdGFydD4nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworY2xhc3MgU3RyZWFtRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxzdHJlYW0gZW5kPicKKworY2xhc3MgQmxvY2tTZXF1ZW5jZVN0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxibG9jayBzZXF1ZW5jZSBzdGFydD4nCisKK2NsYXNzIEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxibG9jayBtYXBwaW5nIHN0YXJ0PicKKworY2xhc3MgQmxvY2tFbmRUb2tlbihUb2tlbik6CisgICAgaWQgPSAnPGJsb2NrIGVuZD4nCisKK2NsYXNzIEZsb3dTZXF1ZW5jZVN0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ1snCisKK2NsYXNzIEZsb3dNYXBwaW5nU3RhcnRUb2tlbihUb2tlbik6CisgICAgaWQgPSAneycKKworY2xhc3MgRmxvd1NlcXVlbmNlRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ10nCisKK2NsYXNzIEZsb3dNYXBwaW5nRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ30nCisKK2NsYXNzIEtleVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc/JworCitjbGFzcyBWYWx1ZVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc6JworCitjbGFzcyBCbG9ja0VudHJ5VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJy0nCisKK2NsYXNzIEZsb3dFbnRyeVRva2VuKFRva2VuKToKKyAgICBpZCA9ICcsJworCitjbGFzcyBBbGlhc1Rva2VuKFRva2VuKToKKyAgICBpZCA9ICc8YWxpYXM+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgQW5jaG9yVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxhbmNob3I+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgVGFnVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzx0YWc+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgU2NhbGFyVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxzY2FsYXI+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgcGxhaW4sIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBzdHlsZT1Ob25lKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYucGxhaW4gPSBwbGFpbgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKKwpkaWZmIC0tZ2l0IGEvbGliMy95YW1sL19faW5pdF9fLnB5IGIvbGliMy95YW1sL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTIwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIzL3lhbWwvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMTIgQEAKKworZnJvbSAuZXJyb3IgaW1wb3J0ICoKKworZnJvbSAudG9rZW5zIGltcG9ydCAqCitmcm9tIC5ldmVudHMgaW1wb3J0ICoKK2Zyb20gLm5vZGVzIGltcG9ydCAqCisKK2Zyb20gLmxvYWRlciBpbXBvcnQgKgorZnJvbSAuZHVtcGVyIGltcG9ydCAqCisKK19fdmVyc2lvbl9fID0gJzMuMTEnCit0cnk6CisgICAgZnJvbSAuY3lhbWwgaW1wb3J0ICoKKyAgICBfX3dpdGhfbGlieWFtbF9fID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9fd2l0aF9saWJ5YW1sX18gPSBGYWxzZQorCitpbXBvcnQgaW8KKworZGVmIHNjYW4oc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBTY2FuIGEgWUFNTCBzdHJlYW0gYW5kIHByb2R1Y2Ugc2Nhbm5pbmcgdG9rZW5zLgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfdG9rZW4oKToKKyAgICAgICAgICAgIHlpZWxkIGxvYWRlci5nZXRfdG9rZW4oKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvYWRlci5kaXNwb3NlKCkKKworZGVmIHBhcnNlKHN0cmVhbSwgTG9hZGVyPUxvYWRlcik6CisgICAgIiIiCisgICAgUGFyc2UgYSBZQU1MIHN0cmVhbSBhbmQgcHJvZHVjZSBwYXJzaW5nIGV2ZW50cy4KKyAgICAiIiIKKyAgICBsb2FkZXIgPSBMb2FkZXIoc3RyZWFtKQorICAgIHRyeToKKyAgICAgICAgd2hpbGUgbG9hZGVyLmNoZWNrX2V2ZW50KCk6CisgICAgICAgICAgICB5aWVsZCBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2FkZXIuZGlzcG9zZSgpCisKK2RlZiBjb21wb3NlKHN0cmVhbSwgTG9hZGVyPUxvYWRlcik6CisgICAgIiIiCisgICAgUGFyc2UgdGhlIGZpcnN0IFlBTUwgZG9jdW1lbnQgaW4gYSBzdHJlYW0KKyAgICBhbmQgcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyByZXByZXNlbnRhdGlvbiB0cmVlLgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbG9hZGVyLmdldF9zaW5nbGVfbm9kZSgpCisgICAgZmluYWxseToKKyAgICAgICAgbG9hZGVyLmRpc3Bvc2UoKQorCitkZWYgY29tcG9zZV9hbGwoc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBQYXJzZSBhbGwgWUFNTCBkb2N1bWVudHMgaW4gYSBzdHJlYW0KKyAgICBhbmQgcHJvZHVjZSBjb3JyZXNwb25kaW5nIHJlcHJlc2VudGF0aW9uIHRyZWVzLgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfbm9kZSgpOgorICAgICAgICAgICAgeWllbGQgbG9hZGVyLmdldF9ub2RlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2FkZXIuZGlzcG9zZSgpCisKK2RlZiBsb2FkKHN0cmVhbSwgTG9hZGVyPUxvYWRlcik6CisgICAgIiIiCisgICAgUGFyc2UgdGhlIGZpcnN0IFlBTUwgZG9jdW1lbnQgaW4gYSBzdHJlYW0KKyAgICBhbmQgcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gb2JqZWN0LgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbG9hZGVyLmdldF9zaW5nbGVfZGF0YSgpCisgICAgZmluYWxseToKKyAgICAgICAgbG9hZGVyLmRpc3Bvc2UoKQorCitkZWYgbG9hZF9hbGwoc3RyZWFtLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBQYXJzZSBhbGwgWUFNTCBkb2N1bWVudHMgaW4gYSBzdHJlYW0KKyAgICBhbmQgcHJvZHVjZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3RzLgorICAgICIiIgorICAgIGxvYWRlciA9IExvYWRlcihzdHJlYW0pCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfZGF0YSgpOgorICAgICAgICAgICAgeWllbGQgbG9hZGVyLmdldF9kYXRhKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2FkZXIuZGlzcG9zZSgpCisKK2RlZiBzYWZlX2xvYWQoc3RyZWFtKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgZmlyc3QgWUFNTCBkb2N1bWVudCBpbiBhIHN0cmVhbQorICAgIGFuZCBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3QuCisgICAgUmVzb2x2ZSBvbmx5IGJhc2ljIFlBTUwgdGFncy4KKyAgICAiIiIKKyAgICByZXR1cm4gbG9hZChzdHJlYW0sIFNhZmVMb2FkZXIpCisKK2RlZiBzYWZlX2xvYWRfYWxsKHN0cmVhbSk6CisgICAgIiIiCisgICAgUGFyc2UgYWxsIFlBTUwgZG9jdW1lbnRzIGluIGEgc3RyZWFtCisgICAgYW5kIHByb2R1Y2UgY29ycmVzcG9uZGluZyBQeXRob24gb2JqZWN0cy4KKyAgICBSZXNvbHZlIG9ubHkgYmFzaWMgWUFNTCB0YWdzLgorICAgICIiIgorICAgIHJldHVybiBsb2FkX2FsbChzdHJlYW0sIFNhZmVMb2FkZXIpCisKK2RlZiBlbWl0KGV2ZW50cywgc3RyZWFtPU5vbmUsIER1bXBlcj1EdW1wZXIsCisgICAgICAgIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgYWxsb3dfdW5pY29kZT1Ob25lLCBsaW5lX2JyZWFrPU5vbmUpOgorICAgICIiIgorICAgIEVtaXQgWUFNTCBwYXJzaW5nIGV2ZW50cyBpbnRvIGEgc3RyZWFtLgorICAgIElmIHN0cmVhbSBpcyBOb25lLCByZXR1cm4gdGhlIHByb2R1Y2VkIHN0cmluZyBpbnN0ZWFkLgorICAgICIiIgorICAgIGdldHZhbHVlID0gTm9uZQorICAgIGlmIHN0cmVhbSBpcyBOb25lOgorICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCisgICAgICAgIGdldHZhbHVlID0gc3RyZWFtLmdldHZhbHVlCisgICAgZHVtcGVyID0gRHVtcGVyKHN0cmVhbSwgY2Fub25pY2FsPWNhbm9uaWNhbCwgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUsIGxpbmVfYnJlYWs9bGluZV9icmVhaykKKyAgICB0cnk6CisgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CisgICAgICAgICAgICBkdW1wZXIuZW1pdChldmVudCkKKyAgICBmaW5hbGx5OgorICAgICAgICBkdW1wZXIuZGlzcG9zZSgpCisgICAgaWYgZ2V0dmFsdWU6CisgICAgICAgIHJldHVybiBnZXR2YWx1ZSgpCisKK2RlZiBzZXJpYWxpemVfYWxsKG5vZGVzLCBzdHJlYW09Tm9uZSwgRHVtcGVyPUR1bXBlciwKKyAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSBzZXF1ZW5jZSBvZiByZXByZXNlbnRhdGlvbiB0cmVlcyBpbnRvIGEgWUFNTCBzdHJlYW0uCisgICAgSWYgc3RyZWFtIGlzIE5vbmUsIHJldHVybiB0aGUgcHJvZHVjZWQgc3RyaW5nIGluc3RlYWQuCisgICAgIiIiCisgICAgZ2V0dmFsdWUgPSBOb25lCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAgICAgICAgZ2V0dmFsdWUgPSBzdHJlYW0uZ2V0dmFsdWUKKyAgICBkdW1wZXIgPSBEdW1wZXIoc3RyZWFtLCBjYW5vbmljYWw9Y2Fub25pY2FsLCBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgZW5jb2Rpbmc9ZW5jb2RpbmcsIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzLAorICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQpCisgICAgdHJ5OgorICAgICAgICBkdW1wZXIub3BlbigpCisgICAgICAgIGZvciBub2RlIGluIG5vZGVzOgorICAgICAgICAgICAgZHVtcGVyLnNlcmlhbGl6ZShub2RlKQorICAgICAgICBkdW1wZXIuY2xvc2UoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGR1bXBlci5kaXNwb3NlKCkKKyAgICBpZiBnZXR2YWx1ZToKKyAgICAgICAgcmV0dXJuIGdldHZhbHVlKCkKKworZGVmIHNlcmlhbGl6ZShub2RlLCBzdHJlYW09Tm9uZSwgRHVtcGVyPUR1bXBlciwgKiprd2RzKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSByZXByZXNlbnRhdGlvbiB0cmVlIGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VyaWFsaXplX2FsbChbbm9kZV0sIHN0cmVhbSwgRHVtcGVyPUR1bXBlciwgKiprd2RzKQorCitkZWYgZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW09Tm9uZSwgRHVtcGVyPUR1bXBlciwKKyAgICAgICAgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSwKKyAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSBzZXF1ZW5jZSBvZiBQeXRob24gb2JqZWN0cyBpbnRvIGEgWUFNTCBzdHJlYW0uCisgICAgSWYgc3RyZWFtIGlzIE5vbmUsIHJldHVybiB0aGUgcHJvZHVjZWQgc3RyaW5nIGluc3RlYWQuCisgICAgIiIiCisgICAgZ2V0dmFsdWUgPSBOb25lCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAgICAgICAgZ2V0dmFsdWUgPSBzdHJlYW0uZ2V0dmFsdWUKKyAgICBkdW1wZXIgPSBEdW1wZXIoc3RyZWFtLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlLAorICAgICAgICAgICAgY2Fub25pY2FsPWNhbm9uaWNhbCwgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUsIGxpbmVfYnJlYWs9bGluZV9icmVhaywKKyAgICAgICAgICAgIGVuY29kaW5nPWVuY29kaW5nLCB2ZXJzaW9uPXZlcnNpb24sIHRhZ3M9dGFncywKKyAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kKQorICAgIHRyeToKKyAgICAgICAgZHVtcGVyLm9wZW4oKQorICAgICAgICBmb3IgZGF0YSBpbiBkb2N1bWVudHM6CisgICAgICAgICAgICBkdW1wZXIucmVwcmVzZW50KGRhdGEpCisgICAgICAgIGR1bXBlci5jbG9zZSgpCisgICAgZmluYWxseToKKyAgICAgICAgZHVtcGVyLmRpc3Bvc2UoKQorICAgIGlmIGdldHZhbHVlOgorICAgICAgICByZXR1cm4gZ2V0dmFsdWUoKQorCitkZWYgZHVtcChkYXRhLCBzdHJlYW09Tm9uZSwgRHVtcGVyPUR1bXBlciwgKiprd2RzKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSBQeXRob24gb2JqZWN0IGludG8gYSBZQU1MIHN0cmVhbS4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICByZXR1cm4gZHVtcF9hbGwoW2RhdGFdLCBzdHJlYW0sIER1bXBlcj1EdW1wZXIsICoqa3dkcykKKworZGVmIHNhZmVfZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW09Tm9uZSwgKiprd2RzKToKKyAgICAiIiIKKyAgICBTZXJpYWxpemUgYSBzZXF1ZW5jZSBvZiBQeXRob24gb2JqZWN0cyBpbnRvIGEgWUFNTCBzdHJlYW0uCisgICAgUHJvZHVjZSBvbmx5IGJhc2ljIFlBTUwgdGFncy4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICByZXR1cm4gZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW0sIER1bXBlcj1TYWZlRHVtcGVyLCAqKmt3ZHMpCisKK2RlZiBzYWZlX2R1bXAoZGF0YSwgc3RyZWFtPU5vbmUsICoqa3dkcyk6CisgICAgIiIiCisgICAgU2VyaWFsaXplIGEgUHl0aG9uIG9iamVjdCBpbnRvIGEgWUFNTCBzdHJlYW0uCisgICAgUHJvZHVjZSBvbmx5IGJhc2ljIFlBTUwgdGFncy4KKyAgICBJZiBzdHJlYW0gaXMgTm9uZSwgcmV0dXJuIHRoZSBwcm9kdWNlZCBzdHJpbmcgaW5zdGVhZC4KKyAgICAiIiIKKyAgICByZXR1cm4gZHVtcF9hbGwoW2RhdGFdLCBzdHJlYW0sIER1bXBlcj1TYWZlRHVtcGVyLCAqKmt3ZHMpCisKK2RlZiBhZGRfaW1wbGljaXRfcmVzb2x2ZXIodGFnLCByZWdleHAsIGZpcnN0PU5vbmUsCisgICAgICAgIExvYWRlcj1Mb2FkZXIsIER1bXBlcj1EdW1wZXIpOgorICAgICIiIgorICAgIEFkZCBhbiBpbXBsaWNpdCBzY2FsYXIgZGV0ZWN0b3IuCisgICAgSWYgYW4gaW1wbGljaXQgc2NhbGFyIHZhbHVlIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ2V4cCwKKyAgICB0aGUgY29ycmVzcG9uZGluZyB0YWcgaXMgYXNzaWduZWQgdG8gdGhlIHNjYWxhci4KKyAgICBmaXJzdCBpcyBhIHNlcXVlbmNlIG9mIHBvc3NpYmxlIGluaXRpYWwgY2hhcmFjdGVycyBvciBOb25lLgorICAgICIiIgorICAgIExvYWRlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIodGFnLCByZWdleHAsIGZpcnN0KQorICAgIER1bXBlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIodGFnLCByZWdleHAsIGZpcnN0KQorCitkZWYgYWRkX3BhdGhfcmVzb2x2ZXIodGFnLCBwYXRoLCBraW5kPU5vbmUsIExvYWRlcj1Mb2FkZXIsIER1bXBlcj1EdW1wZXIpOgorICAgICIiIgorICAgIEFkZCBhIHBhdGggYmFzZWQgcmVzb2x2ZXIgZm9yIHRoZSBnaXZlbiB0YWcuCisgICAgQSBwYXRoIGlzIGEgbGlzdCBvZiBrZXlzIHRoYXQgZm9ybXMgYSBwYXRoCisgICAgdG8gYSBub2RlIGluIHRoZSByZXByZXNlbnRhdGlvbiB0cmVlLgorICAgIEtleXMgY2FuIGJlIHN0cmluZyB2YWx1ZXMsIGludGVnZXJzLCBvciBOb25lLgorICAgICIiIgorICAgIExvYWRlci5hZGRfcGF0aF9yZXNvbHZlcih0YWcsIHBhdGgsIGtpbmQpCisgICAgRHVtcGVyLmFkZF9wYXRoX3Jlc29sdmVyKHRhZywgcGF0aCwga2luZCkKKworZGVmIGFkZF9jb25zdHJ1Y3Rvcih0YWcsIGNvbnN0cnVjdG9yLCBMb2FkZXI9TG9hZGVyKToKKyAgICAiIiIKKyAgICBBZGQgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIHRhZy4KKyAgICBDb25zdHJ1Y3RvciBpcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIExvYWRlciBpbnN0YW5jZQorICAgIGFuZCBhIG5vZGUgb2JqZWN0IGFuZCBwcm9kdWNlcyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gb2JqZWN0LgorICAgICIiIgorICAgIExvYWRlci5hZGRfY29uc3RydWN0b3IodGFnLCBjb25zdHJ1Y3RvcikKKworZGVmIGFkZF9tdWx0aV9jb25zdHJ1Y3Rvcih0YWdfcHJlZml4LCBtdWx0aV9jb25zdHJ1Y3RvciwgTG9hZGVyPUxvYWRlcik6CisgICAgIiIiCisgICAgQWRkIGEgbXVsdGktY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiB0YWcgcHJlZml4LgorICAgIE11bHRpLWNvbnN0cnVjdG9yIGlzIGNhbGxlZCBmb3IgYSBub2RlIGlmIGl0cyB0YWcgc3RhcnRzIHdpdGggdGFnX3ByZWZpeC4KKyAgICBNdWx0aS1jb25zdHJ1Y3RvciBhY2NlcHRzIGEgTG9hZGVyIGluc3RhbmNlLCBhIHRhZyBzdWZmaXgsCisgICAgYW5kIGEgbm9kZSBvYmplY3QgYW5kIHByb2R1Y2VzIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBvYmplY3QuCisgICAgIiIiCisgICAgTG9hZGVyLmFkZF9tdWx0aV9jb25zdHJ1Y3Rvcih0YWdfcHJlZml4LCBtdWx0aV9jb25zdHJ1Y3RvcikKKworZGVmIGFkZF9yZXByZXNlbnRlcihkYXRhX3R5cGUsIHJlcHJlc2VudGVyLCBEdW1wZXI9RHVtcGVyKToKKyAgICAiIiIKKyAgICBBZGQgYSByZXByZXNlbnRlciBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgUmVwcmVzZW50ZXIgaXMgYSBmdW5jdGlvbiBhY2NlcHRpbmcgYSBEdW1wZXIgaW5zdGFuY2UKKyAgICBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGRhdGEgdHlwZQorICAgIGFuZCBwcm9kdWNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcmVwcmVzZW50YXRpb24gbm9kZS4KKyAgICAiIiIKKyAgICBEdW1wZXIuYWRkX3JlcHJlc2VudGVyKGRhdGFfdHlwZSwgcmVwcmVzZW50ZXIpCisKK2RlZiBhZGRfbXVsdGlfcmVwcmVzZW50ZXIoZGF0YV90eXBlLCBtdWx0aV9yZXByZXNlbnRlciwgRHVtcGVyPUR1bXBlcik6CisgICAgIiIiCisgICAgQWRkIGEgcmVwcmVzZW50ZXIgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgIE11bHRpLXJlcHJlc2VudGVyIGlzIGEgZnVuY3Rpb24gYWNjZXB0aW5nIGEgRHVtcGVyIGluc3RhbmNlCisgICAgYW5kIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBkYXRhIHR5cGUgb3Igc3VidHlwZQorICAgIGFuZCBwcm9kdWNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcmVwcmVzZW50YXRpb24gbm9kZS4KKyAgICAiIiIKKyAgICBEdW1wZXIuYWRkX211bHRpX3JlcHJlc2VudGVyKGRhdGFfdHlwZSwgbXVsdGlfcmVwcmVzZW50ZXIpCisKK2NsYXNzIFlBTUxPYmplY3RNZXRhY2xhc3ModHlwZSk6CisgICAgIiIiCisgICAgVGhlIG1ldGFjbGFzcyBmb3IgWUFNTE9iamVjdC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywga3dkcyk6CisgICAgICAgIHN1cGVyKFlBTUxPYmplY3RNZXRhY2xhc3MsIGNscykuX19pbml0X18obmFtZSwgYmFzZXMsIGt3ZHMpCisgICAgICAgIGlmICd5YW1sX3RhZycgaW4ga3dkcyBhbmQga3dkc1sneWFtbF90YWcnXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNscy55YW1sX2xvYWRlci5hZGRfY29uc3RydWN0b3IoY2xzLnlhbWxfdGFnLCBjbHMuZnJvbV95YW1sKQorICAgICAgICAgICAgY2xzLnlhbWxfZHVtcGVyLmFkZF9yZXByZXNlbnRlcihjbHMsIGNscy50b195YW1sKQorCitjbGFzcyBZQU1MT2JqZWN0KG1ldGFjbGFzcz1ZQU1MT2JqZWN0TWV0YWNsYXNzKToKKyAgICAiIiIKKyAgICBBbiBvYmplY3QgdGhhdCBjYW4gZHVtcCBpdHNlbGYgdG8gYSBZQU1MIHN0cmVhbQorICAgIGFuZCBsb2FkIGl0c2VsZiBmcm9tIGEgWUFNTCBzdHJlYW0uCisgICAgIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoKSAgIyBubyBkaXJlY3QgaW5zdGFudGlhdGlvbiwgc28gYWxsb3cgaW1tdXRhYmxlIHN1YmNsYXNzZXMKKworICAgIHlhbWxfbG9hZGVyID0gTG9hZGVyCisgICAgeWFtbF9kdW1wZXIgPSBEdW1wZXIKKworICAgIHlhbWxfdGFnID0gTm9uZQorICAgIHlhbWxfZmxvd19zdHlsZSA9IE5vbmUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3lhbWwoY2xzLCBsb2FkZXIsIG5vZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCBhIHJlcHJlc2VudGF0aW9uIG5vZGUgdG8gYSBQeXRob24gb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGxvYWRlci5jb25zdHJ1Y3RfeWFtbF9vYmplY3Qobm9kZSwgY2xzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRvX3lhbWwoY2xzLCBkdW1wZXIsIGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCBhIFB5dGhvbiBvYmplY3QgdG8gYSByZXByZXNlbnRhdGlvbiBub2RlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGR1bXBlci5yZXByZXNlbnRfeWFtbF9vYmplY3QoY2xzLnlhbWxfdGFnLCBkYXRhLCBjbHMsCisgICAgICAgICAgICAgICAgZmxvd19zdHlsZT1jbHMueWFtbF9mbG93X3N0eWxlKQorCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvY29tcG9zZXIucHkgYi9saWIzL3lhbWwvY29tcG9zZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjNmE3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYjMveWFtbC9jb21wb3Nlci5weQpAQCAtMCwwICsxLDEzOSBAQAorCitfX2FsbF9fID0gWydDb21wb3NlcicsICdDb21wb3NlckVycm9yJ10KKworZnJvbSAuZXJyb3IgaW1wb3J0IE1hcmtlZFlBTUxFcnJvcgorZnJvbSAuZXZlbnRzIGltcG9ydCAqCitmcm9tIC5ub2RlcyBpbXBvcnQgKgorCitjbGFzcyBDb21wb3NlckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBDb21wb3NlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hbmNob3JzID0ge30KKworICAgIGRlZiBjaGVja19ub2RlKHNlbGYpOgorICAgICAgICAjIERyb3AgdGhlIFNUUkVBTS1TVEFSVCBldmVudC4KKyAgICAgICAgaWYgc2VsZi5jaGVja19ldmVudChTdHJlYW1TdGFydEV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuZ2V0X2V2ZW50KCkKKworICAgICAgICAjIElmIHRoZXJlIGFyZSBtb3JlIGRvY3VtZW50cyBhdmFpbGFibGU/CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5jaGVja19ldmVudChTdHJlYW1FbmRFdmVudCkKKworICAgIGRlZiBnZXRfbm9kZShzZWxmKToKKyAgICAgICAgIyBHZXQgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgbmV4dCBkb2N1bWVudC4KKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfZXZlbnQoU3RyZWFtRW5kRXZlbnQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcG9zZV9kb2N1bWVudCgpCisKKyAgICBkZWYgZ2V0X3NpbmdsZV9ub2RlKHNlbGYpOgorICAgICAgICAjIERyb3AgdGhlIFNUUkVBTS1TVEFSVCBldmVudC4KKyAgICAgICAgc2VsZi5nZXRfZXZlbnQoKQorCisgICAgICAgICMgQ29tcG9zZSBhIGRvY3VtZW50IGlmIHRoZSBzdHJlYW0gaXMgbm90IGVtcHR5LgorICAgICAgICBkb2N1bWVudCA9IE5vbmUKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfZXZlbnQoU3RyZWFtRW5kRXZlbnQpOgorICAgICAgICAgICAgZG9jdW1lbnQgPSBzZWxmLmNvbXBvc2VfZG9jdW1lbnQoKQorCisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHN0cmVhbSBjb250YWlucyBubyBtb3JlIGRvY3VtZW50cy4KKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfZXZlbnQoU3RyZWFtRW5kRXZlbnQpOgorICAgICAgICAgICAgZXZlbnQgPSBzZWxmLmdldF9ldmVudCgpCisgICAgICAgICAgICByYWlzZSBDb21wb3NlckVycm9yKCJleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRfbWFyaywgImJ1dCBmb3VuZCBhbm90aGVyIGRvY3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnRfbWFyaykKKworICAgICAgICAjIERyb3AgdGhlIFNUUkVBTS1FTkQgZXZlbnQuCisgICAgICAgIHNlbGYuZ2V0X2V2ZW50KCkKKworICAgICAgICByZXR1cm4gZG9jdW1lbnQKKworICAgIGRlZiBjb21wb3NlX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIERyb3AgdGhlIERPQ1VNRU5ULVNUQVJUIGV2ZW50LgorICAgICAgICBzZWxmLmdldF9ldmVudCgpCisKKyAgICAgICAgIyBDb21wb3NlIHRoZSByb290IG5vZGUuCisgICAgICAgIG5vZGUgPSBzZWxmLmNvbXBvc2Vfbm9kZShOb25lLCBOb25lKQorCisgICAgICAgICMgRHJvcCB0aGUgRE9DVU1FTlQtRU5EIGV2ZW50LgorICAgICAgICBzZWxmLmdldF9ldmVudCgpCisKKyAgICAgICAgc2VsZi5hbmNob3JzID0ge30KKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBjb21wb3NlX25vZGUoc2VsZiwgcGFyZW50LCBpbmRleCk6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfZXZlbnQoQWxpYXNFdmVudCk6CisgICAgICAgICAgICBldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgICAgIGFuY2hvciA9IGV2ZW50LmFuY2hvcgorICAgICAgICAgICAgaWYgYW5jaG9yIG5vdCBpbiBzZWxmLmFuY2hvcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcG9zZXJFcnJvcihOb25lLCBOb25lLCAiZm91bmQgdW5kZWZpbmVkIGFsaWFzICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBhbmNob3IsIGV2ZW50LnN0YXJ0X21hcmspCisgICAgICAgICAgICByZXR1cm4gc2VsZi5hbmNob3JzW2FuY2hvcl0KKyAgICAgICAgZXZlbnQgPSBzZWxmLnBlZWtfZXZlbnQoKQorICAgICAgICBhbmNob3IgPSBldmVudC5hbmNob3IKKyAgICAgICAgaWYgYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgYW5jaG9yIGluIHNlbGYuYW5jaG9yczoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wb3NlckVycm9yKCJmb3VuZCBkdXBsaWNhdGUgYW5jaG9yICVyOyBmaXJzdCBvY2N1cmVuY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAlIGFuY2hvciwgc2VsZi5hbmNob3JzW2FuY2hvcl0uc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgb2NjdXJlbmNlIiwgZXZlbnQuc3RhcnRfbWFyaykKKyAgICAgICAgc2VsZi5kZXNjZW5kX3Jlc29sdmVyKHBhcmVudCwgaW5kZXgpCisgICAgICAgIGlmIHNlbGYuY2hlY2tfZXZlbnQoU2NhbGFyRXZlbnQpOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tcG9zZV9zY2FsYXJfbm9kZShhbmNob3IpCisgICAgICAgIGVsaWYgc2VsZi5jaGVja19ldmVudChTZXF1ZW5jZVN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tcG9zZV9zZXF1ZW5jZV9ub2RlKGFuY2hvcikKKyAgICAgICAgZWxpZiBzZWxmLmNoZWNrX2V2ZW50KE1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbXBvc2VfbWFwcGluZ19ub2RlKGFuY2hvcikKKyAgICAgICAgc2VsZi5hc2NlbmRfcmVzb2x2ZXIoKQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGNvbXBvc2Vfc2NhbGFyX25vZGUoc2VsZiwgYW5jaG9yKToKKyAgICAgICAgZXZlbnQgPSBzZWxmLmdldF9ldmVudCgpCisgICAgICAgIHRhZyA9IGV2ZW50LnRhZworICAgICAgICBpZiB0YWcgaXMgTm9uZSBvciB0YWcgPT0gJyEnOgorICAgICAgICAgICAgdGFnID0gc2VsZi5yZXNvbHZlKFNjYWxhck5vZGUsIGV2ZW50LnZhbHVlLCBldmVudC5pbXBsaWNpdCkKKyAgICAgICAgbm9kZSA9IFNjYWxhck5vZGUodGFnLCBldmVudC52YWx1ZSwKKyAgICAgICAgICAgICAgICBldmVudC5zdGFydF9tYXJrLCBldmVudC5lbmRfbWFyaywgc3R5bGU9ZXZlbnQuc3R5bGUpCisgICAgICAgIGlmIGFuY2hvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yc1thbmNob3JdID0gbm9kZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGNvbXBvc2Vfc2VxdWVuY2Vfbm9kZShzZWxmLCBhbmNob3IpOgorICAgICAgICBzdGFydF9ldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgdGFnID0gc3RhcnRfZXZlbnQudGFnCisgICAgICAgIGlmIHRhZyBpcyBOb25lIG9yIHRhZyA9PSAnISc6CisgICAgICAgICAgICB0YWcgPSBzZWxmLnJlc29sdmUoU2VxdWVuY2VOb2RlLCBOb25lLCBzdGFydF9ldmVudC5pbXBsaWNpdCkKKyAgICAgICAgbm9kZSA9IFNlcXVlbmNlTm9kZSh0YWcsIFtdLAorICAgICAgICAgICAgICAgIHN0YXJ0X2V2ZW50LnN0YXJ0X21hcmssIE5vbmUsCisgICAgICAgICAgICAgICAgZmxvd19zdHlsZT1zdGFydF9ldmVudC5mbG93X3N0eWxlKQorICAgICAgICBpZiBhbmNob3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFuY2hvcnNbYW5jaG9yXSA9IG5vZGUKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNoZWNrX2V2ZW50KFNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgbm9kZS52YWx1ZS5hcHBlbmQoc2VsZi5jb21wb3NlX25vZGUobm9kZSwgaW5kZXgpKQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICBlbmRfZXZlbnQgPSBzZWxmLmdldF9ldmVudCgpCisgICAgICAgIG5vZGUuZW5kX21hcmsgPSBlbmRfZXZlbnQuZW5kX21hcmsKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBjb21wb3NlX21hcHBpbmdfbm9kZShzZWxmLCBhbmNob3IpOgorICAgICAgICBzdGFydF9ldmVudCA9IHNlbGYuZ2V0X2V2ZW50KCkKKyAgICAgICAgdGFnID0gc3RhcnRfZXZlbnQudGFnCisgICAgICAgIGlmIHRhZyBpcyBOb25lIG9yIHRhZyA9PSAnISc6CisgICAgICAgICAgICB0YWcgPSBzZWxmLnJlc29sdmUoTWFwcGluZ05vZGUsIE5vbmUsIHN0YXJ0X2V2ZW50LmltcGxpY2l0KQorICAgICAgICBub2RlID0gTWFwcGluZ05vZGUodGFnLCBbXSwKKyAgICAgICAgICAgICAgICBzdGFydF9ldmVudC5zdGFydF9tYXJrLCBOb25lLAorICAgICAgICAgICAgICAgIGZsb3dfc3R5bGU9c3RhcnRfZXZlbnQuZmxvd19zdHlsZSkKKyAgICAgICAgaWYgYW5jaG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbmNob3JzW2FuY2hvcl0gPSBub2RlCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNoZWNrX2V2ZW50KE1hcHBpbmdFbmRFdmVudCk6CisgICAgICAgICAgICAja2V5X2V2ZW50ID0gc2VsZi5wZWVrX2V2ZW50KCkKKyAgICAgICAgICAgIGl0ZW1fa2V5ID0gc2VsZi5jb21wb3NlX25vZGUobm9kZSwgTm9uZSkKKyAgICAgICAgICAgICNpZiBpdGVtX2tleSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgIyAgICByYWlzZSBDb21wb3NlckVycm9yKCJ3aGlsZSBjb21wb3NpbmcgYSBtYXBwaW5nIiwgc3RhcnRfZXZlbnQuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICMgICAgICAgICAgICAiZm91bmQgZHVwbGljYXRlIGtleSIsIGtleV9ldmVudC5zdGFydF9tYXJrKQorICAgICAgICAgICAgaXRlbV92YWx1ZSA9IHNlbGYuY29tcG9zZV9ub2RlKG5vZGUsIGl0ZW1fa2V5KQorICAgICAgICAgICAgI25vZGUudmFsdWVbaXRlbV9rZXldID0gaXRlbV92YWx1ZQorICAgICAgICAgICAgbm9kZS52YWx1ZS5hcHBlbmQoKGl0ZW1fa2V5LCBpdGVtX3ZhbHVlKSkKKyAgICAgICAgZW5kX2V2ZW50ID0gc2VsZi5nZXRfZXZlbnQoKQorICAgICAgICBub2RlLmVuZF9tYXJrID0gZW5kX2V2ZW50LmVuZF9tYXJrCisgICAgICAgIHJldHVybiBub2RlCisKZGlmZiAtLWdpdCBhL2xpYjMveWFtbC9jb25zdHJ1Y3Rvci5weSBiL2xpYjMveWFtbC9jb25zdHJ1Y3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE1NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL2NvbnN0cnVjdG9yLnB5CkBAIC0wLDAgKzEsNjg2IEBACisKK19fYWxsX18gPSBbJ0Jhc2VDb25zdHJ1Y3RvcicsICdTYWZlQ29uc3RydWN0b3InLCAnQ29uc3RydWN0b3InLAorICAgICdDb25zdHJ1Y3RvckVycm9yJ10KKworZnJvbSAuZXJyb3IgaW1wb3J0ICoKK2Zyb20gLm5vZGVzIGltcG9ydCAqCisKK2ltcG9ydCBjb2xsZWN0aW9ucywgZGF0ZXRpbWUsIGJhc2U2NCwgYmluYXNjaWksIHJlLCBzeXMsIHR5cGVzCisKK2NsYXNzIENvbnN0cnVjdG9yRXJyb3IoTWFya2VkWUFNTEVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIEJhc2VDb25zdHJ1Y3RvcjoKKworICAgIHlhbWxfY29uc3RydWN0b3JzID0ge30KKyAgICB5YW1sX211bHRpX2NvbnN0cnVjdG9ycyA9IHt9CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29uc3RydWN0ZWRfb2JqZWN0cyA9IHt9CisgICAgICAgIHNlbGYucmVjdXJzaXZlX29iamVjdHMgPSB7fQorICAgICAgICBzZWxmLnN0YXRlX2dlbmVyYXRvcnMgPSBbXQorICAgICAgICBzZWxmLmRlZXBfY29uc3RydWN0ID0gRmFsc2UKKworICAgIGRlZiBjaGVja19kYXRhKHNlbGYpOgorICAgICAgICAjIElmIHRoZXJlIGFyZSBtb3JlIGRvY3VtZW50cyBhdmFpbGFibGU/CisgICAgICAgIHJldHVybiBzZWxmLmNoZWNrX25vZGUoKQorCisgICAgZGVmIGdldF9kYXRhKHNlbGYpOgorICAgICAgICAjIENvbnN0cnVjdCBhbmQgcmV0dXJuIHRoZSBuZXh0IGRvY3VtZW50LgorICAgICAgICBpZiBzZWxmLmNoZWNrX25vZGUoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9kb2N1bWVudChzZWxmLmdldF9ub2RlKCkpCisKKyAgICBkZWYgZ2V0X3NpbmdsZV9kYXRhKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzdHJlYW0gY29udGFpbnMgYSBzaW5nbGUgZG9jdW1lbnQgYW5kIGNvbnN0cnVjdCBpdC4KKyAgICAgICAgbm9kZSA9IHNlbGYuZ2V0X3NpbmdsZV9ub2RlKCkKKyAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9kb2N1bWVudChub2RlKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGNvbnN0cnVjdF9kb2N1bWVudChzZWxmLCBub2RlKToKKyAgICAgICAgZGF0YSA9IHNlbGYuY29uc3RydWN0X29iamVjdChub2RlKQorICAgICAgICB3aGlsZSBzZWxmLnN0YXRlX2dlbmVyYXRvcnM6CisgICAgICAgICAgICBzdGF0ZV9nZW5lcmF0b3JzID0gc2VsZi5zdGF0ZV9nZW5lcmF0b3JzCisgICAgICAgICAgICBzZWxmLnN0YXRlX2dlbmVyYXRvcnMgPSBbXQorICAgICAgICAgICAgZm9yIGdlbmVyYXRvciBpbiBzdGF0ZV9nZW5lcmF0b3JzOgorICAgICAgICAgICAgICAgIGZvciBkdW1teSBpbiBnZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jb25zdHJ1Y3RlZF9vYmplY3RzID0ge30KKyAgICAgICAgc2VsZi5yZWN1cnNpdmVfb2JqZWN0cyA9IHt9CisgICAgICAgIHNlbGYuZGVlcF9jb25zdHJ1Y3QgPSBGYWxzZQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGNvbnN0cnVjdF9vYmplY3Qoc2VsZiwgbm9kZSwgZGVlcD1GYWxzZSk6CisgICAgICAgIGlmIG5vZGUgaW4gc2VsZi5jb25zdHJ1Y3RlZF9vYmplY3RzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0ZWRfb2JqZWN0c1tub2RlXQorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgb2xkX2RlZXAgPSBzZWxmLmRlZXBfY29uc3RydWN0CisgICAgICAgICAgICBzZWxmLmRlZXBfY29uc3RydWN0ID0gVHJ1ZQorICAgICAgICBpZiBub2RlIGluIHNlbGYucmVjdXJzaXZlX29iamVjdHM6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmNvbnN0cnVjdGFibGUgcmVjdXJzaXZlIG5vZGUiLCBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIHNlbGYucmVjdXJzaXZlX29iamVjdHNbbm9kZV0gPSBOb25lCisgICAgICAgIGNvbnN0cnVjdG9yID0gTm9uZQorICAgICAgICB0YWdfc3VmZml4ID0gTm9uZQorICAgICAgICBpZiBub2RlLnRhZyBpbiBzZWxmLnlhbWxfY29uc3RydWN0b3JzOgorICAgICAgICAgICAgY29uc3RydWN0b3IgPSBzZWxmLnlhbWxfY29uc3RydWN0b3JzW25vZGUudGFnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHRhZ19wcmVmaXggaW4gc2VsZi55YW1sX211bHRpX2NvbnN0cnVjdG9yczoKKyAgICAgICAgICAgICAgICBpZiBub2RlLnRhZy5zdGFydHN3aXRoKHRhZ19wcmVmaXgpOgorICAgICAgICAgICAgICAgICAgICB0YWdfc3VmZml4ID0gbm9kZS50YWdbbGVuKHRhZ19wcmVmaXgpOl0KKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBzZWxmLnlhbWxfbXVsdGlfY29uc3RydWN0b3JzW3RhZ19wcmVmaXhdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIE5vbmUgaW4gc2VsZi55YW1sX211bHRpX2NvbnN0cnVjdG9yczoKKyAgICAgICAgICAgICAgICAgICAgdGFnX3N1ZmZpeCA9IG5vZGUudGFnCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2VsZi55YW1sX211bHRpX2NvbnN0cnVjdG9yc1tOb25lXQorICAgICAgICAgICAgICAgIGVsaWYgTm9uZSBpbiBzZWxmLnlhbWxfY29uc3RydWN0b3JzOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHNlbGYueWFtbF9jb25zdHJ1Y3RvcnNbTm9uZV0KKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgU2NhbGFyTm9kZSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2VsZi5fX2NsYXNzX18uY29uc3RydWN0X3NjYWxhcgorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBTZXF1ZW5jZU5vZGUpOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHNlbGYuX19jbGFzc19fLmNvbnN0cnVjdF9zZXF1ZW5jZQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2VsZi5fX2NsYXNzX18uY29uc3RydWN0X21hcHBpbmcKKyAgICAgICAgaWYgdGFnX3N1ZmZpeCBpcyBOb25lOgorICAgICAgICAgICAgZGF0YSA9IGNvbnN0cnVjdG9yKHNlbGYsIG5vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gY29uc3RydWN0b3Ioc2VsZiwgdGFnX3N1ZmZpeCwgbm9kZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCB0eXBlcy5HZW5lcmF0b3JUeXBlKToKKyAgICAgICAgICAgIGdlbmVyYXRvciA9IGRhdGEKKyAgICAgICAgICAgIGRhdGEgPSBuZXh0KGdlbmVyYXRvcikKKyAgICAgICAgICAgIGlmIHNlbGYuZGVlcF9jb25zdHJ1Y3Q6CisgICAgICAgICAgICAgICAgZm9yIGR1bW15IGluIGdlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlX2dlbmVyYXRvcnMuYXBwZW5kKGdlbmVyYXRvcikKKyAgICAgICAgc2VsZi5jb25zdHJ1Y3RlZF9vYmplY3RzW25vZGVdID0gZGF0YQorICAgICAgICBkZWwgc2VsZi5yZWN1cnNpdmVfb2JqZWN0c1tub2RlXQorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgc2VsZi5kZWVwX2NvbnN0cnVjdCA9IG9sZF9kZWVwCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgY29uc3RydWN0X3NjYWxhcihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgU2NhbGFyTm9kZSk6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHNjYWxhciBub2RlLCBidXQgZm91bmQgJXMiICUgbm9kZS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICByZXR1cm4gbm9kZS52YWx1ZQorCisgICAgZGVmIGNvbnN0cnVjdF9zZXF1ZW5jZShzZWxmLCBub2RlLCBkZWVwPUZhbHNlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2VxdWVuY2Ugbm9kZSwgYnV0IGZvdW5kICVzIiAlIG5vZGUuaWQsCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIFtzZWxmLmNvbnN0cnVjdF9vYmplY3QoY2hpbGQsIGRlZXA9ZGVlcCkKKyAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS52YWx1ZV0KKworICAgIGRlZiBjb25zdHJ1Y3RfbWFwcGluZyhzZWxmLCBub2RlLCBkZWVwPUZhbHNlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBtYXBwaW5nIG5vZGUsIGJ1dCBmb3VuZCAlcyIgJSBub2RlLmlkLAorICAgICAgICAgICAgICAgICAgICBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIG1hcHBpbmcgPSB7fQorICAgICAgICBmb3Iga2V5X25vZGUsIHZhbHVlX25vZGUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgIGtleSA9IHNlbGYuY29uc3RydWN0X29iamVjdChrZXlfbm9kZSwgZGVlcD1kZWVwKQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBjb2xsZWN0aW9ucy5IYXNoYWJsZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgbWFwcGluZyIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmhhc2hhYmxlIGtleSIsIGtleV9ub2RlLnN0YXJ0X21hcmspCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X29iamVjdCh2YWx1ZV9ub2RlLCBkZWVwPWRlZXApCisgICAgICAgICAgICBtYXBwaW5nW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gbWFwcGluZworCisgICAgZGVmIGNvbnN0cnVjdF9wYWlycyhzZWxmLCBub2RlLCBkZWVwPUZhbHNlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBtYXBwaW5nIG5vZGUsIGJ1dCBmb3VuZCAlcyIgJSBub2RlLmlkLAorICAgICAgICAgICAgICAgICAgICBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIHBhaXJzID0gW10KKyAgICAgICAgZm9yIGtleV9ub2RlLCB2YWx1ZV9ub2RlIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICBrZXkgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3Qoa2V5X25vZGUsIGRlZXA9ZGVlcCkKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfb2JqZWN0KHZhbHVlX25vZGUsIGRlZXA9ZGVlcCkKKyAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgIHJldHVybiBwYWlycworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFkZF9jb25zdHJ1Y3RvcihjbHMsIHRhZywgY29uc3RydWN0b3IpOgorICAgICAgICBpZiBub3QgJ3lhbWxfY29uc3RydWN0b3JzJyBpbiBjbHMuX19kaWN0X186CisgICAgICAgICAgICBjbHMueWFtbF9jb25zdHJ1Y3RvcnMgPSBjbHMueWFtbF9jb25zdHJ1Y3RvcnMuY29weSgpCisgICAgICAgIGNscy55YW1sX2NvbnN0cnVjdG9yc1t0YWddID0gY29uc3RydWN0b3IKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhZGRfbXVsdGlfY29uc3RydWN0b3IoY2xzLCB0YWdfcHJlZml4LCBtdWx0aV9jb25zdHJ1Y3Rvcik6CisgICAgICAgIGlmIG5vdCAneWFtbF9tdWx0aV9jb25zdHJ1Y3RvcnMnIGluIGNscy5fX2RpY3RfXzoKKyAgICAgICAgICAgIGNscy55YW1sX211bHRpX2NvbnN0cnVjdG9ycyA9IGNscy55YW1sX211bHRpX2NvbnN0cnVjdG9ycy5jb3B5KCkKKyAgICAgICAgY2xzLnlhbWxfbXVsdGlfY29uc3RydWN0b3JzW3RhZ19wcmVmaXhdID0gbXVsdGlfY29uc3RydWN0b3IKKworY2xhc3MgU2FmZUNvbnN0cnVjdG9yKEJhc2VDb25zdHJ1Y3Rvcik6CisKKyAgICBkZWYgY29uc3RydWN0X3NjYWxhcihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICBmb3Iga2V5X25vZGUsIHZhbHVlX25vZGUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICBpZiBrZXlfbm9kZS50YWcgPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnZhbHVlJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0X3NjYWxhcih2YWx1ZV9ub2RlKQorICAgICAgICByZXR1cm4gc3VwZXIoKS5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisKKyAgICBkZWYgZmxhdHRlbl9tYXBwaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICBtZXJnZSA9IFtdCisgICAgICAgIGluZGV4ID0gMAorICAgICAgICB3aGlsZSBpbmRleCA8IGxlbihub2RlLnZhbHVlKToKKyAgICAgICAgICAgIGtleV9ub2RlLCB2YWx1ZV9ub2RlID0gbm9kZS52YWx1ZVtpbmRleF0KKyAgICAgICAgICAgIGlmIGtleV9ub2RlLnRhZyA9PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnOgorICAgICAgICAgICAgICAgIGRlbCBub2RlLnZhbHVlW2luZGV4XQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWVfbm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYXR0ZW5fbWFwcGluZyh2YWx1ZV9ub2RlKQorICAgICAgICAgICAgICAgICAgICBtZXJnZS5leHRlbmQodmFsdWVfbm9kZS52YWx1ZSkKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWVfbm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgICAgICAgICAgc3VibWVyZ2UgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3Igc3Vibm9kZSBpbiB2YWx1ZV9ub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3Vibm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhIG1hcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgbWFwcGluZyBmb3IgbWVyZ2luZywgYnV0IGZvdW5kICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBzdWJub2RlLmlkLCBzdWJub2RlLnN0YXJ0X21hcmspCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYXR0ZW5fbWFwcGluZyhzdWJub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VibWVyZ2UuYXBwZW5kKHN1Ym5vZGUudmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHN1Ym1lcmdlLnJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gc3VibWVyZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS5leHRlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgbWFwcGluZyIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBtYXBwaW5nIG9yIGxpc3Qgb2YgbWFwcGluZ3MgZm9yIG1lcmdpbmcsIGJ1dCBmb3VuZCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHZhbHVlX25vZGUuaWQsIHZhbHVlX25vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGVsaWYga2V5X25vZGUudGFnID09ICd0YWc6eWFtbC5vcmcsMjAwMjp2YWx1ZSc6CisgICAgICAgICAgICAgICAga2V5X25vZGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicKKyAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgaWYgbWVyZ2U6CisgICAgICAgICAgICBub2RlLnZhbHVlID0gbWVyZ2UgKyBub2RlLnZhbHVlCisKKyAgICBkZWYgY29uc3RydWN0X21hcHBpbmcoc2VsZiwgbm9kZSwgZGVlcD1GYWxzZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgc2VsZi5mbGF0dGVuX21hcHBpbmcobm9kZSkKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuY29uc3RydWN0X21hcHBpbmcobm9kZSwgZGVlcD1kZWVwKQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX251bGwoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgYm9vbF92YWx1ZXMgPSB7CisgICAgICAgICd5ZXMnOiAgICAgIFRydWUsCisgICAgICAgICdubyc6ICAgICAgIEZhbHNlLAorICAgICAgICAndHJ1ZSc6ICAgICBUcnVlLAorICAgICAgICAnZmFsc2UnOiAgICBGYWxzZSwKKyAgICAgICAgJ29uJzogICAgICAgVHJ1ZSwKKyAgICAgICAgJ29mZic6ICAgICAgRmFsc2UsCisgICAgfQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX2Jvb2woc2VsZiwgbm9kZSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisgICAgICAgIHJldHVybiBzZWxmLmJvb2xfdmFsdWVzW3ZhbHVlLmxvd2VyKCldCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfaW50KHNlbGYsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ18nLCAnJykKKyAgICAgICAgc2lnbiA9ICsxCisgICAgICAgIGlmIHZhbHVlWzBdID09ICctJzoKKyAgICAgICAgICAgIHNpZ24gPSAtMQorICAgICAgICBpZiB2YWx1ZVswXSBpbiAnKy0nOgorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOl0KKyAgICAgICAgaWYgdmFsdWUgPT0gJzAnOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxpZiB2YWx1ZS5zdGFydHN3aXRoKCcwYicpOgorICAgICAgICAgICAgcmV0dXJuIHNpZ24qaW50KHZhbHVlWzI6XSwgMikKKyAgICAgICAgZWxpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOgorICAgICAgICAgICAgcmV0dXJuIHNpZ24qaW50KHZhbHVlWzI6XSwgMTYpCisgICAgICAgIGVsaWYgdmFsdWVbMF0gPT0gJzAnOgorICAgICAgICAgICAgcmV0dXJuIHNpZ24qaW50KHZhbHVlLCA4KQorICAgICAgICBlbGlmICc6JyBpbiB2YWx1ZToKKyAgICAgICAgICAgIGRpZ2l0cyA9IFtpbnQocGFydCkgZm9yIHBhcnQgaW4gdmFsdWUuc3BsaXQoJzonKV0KKyAgICAgICAgICAgIGRpZ2l0cy5yZXZlcnNlKCkKKyAgICAgICAgICAgIGJhc2UgPSAxCisgICAgICAgICAgICB2YWx1ZSA9IDAKKyAgICAgICAgICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gZGlnaXQqYmFzZQorICAgICAgICAgICAgICAgIGJhc2UgKj0gNjAKKyAgICAgICAgICAgIHJldHVybiBzaWduKnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2lnbippbnQodmFsdWUpCisKKyAgICBpbmZfdmFsdWUgPSAxZTMwMAorICAgIHdoaWxlIGluZl92YWx1ZSAhPSBpbmZfdmFsdWUqaW5mX3ZhbHVlOgorICAgICAgICBpbmZfdmFsdWUgKj0gaW5mX3ZhbHVlCisgICAgbmFuX3ZhbHVlID0gLWluZl92YWx1ZS9pbmZfdmFsdWUgICAjIFRyeWluZyB0byBtYWtlIGEgcXVpZXQgTmFOIChsaWtlIEM5OSkuCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfZmxvYXQoc2VsZiwgbm9kZSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXycsICcnKS5sb3dlcigpCisgICAgICAgIHNpZ24gPSArMQorICAgICAgICBpZiB2YWx1ZVswXSA9PSAnLSc6CisgICAgICAgICAgICBzaWduID0gLTEKKyAgICAgICAgaWYgdmFsdWVbMF0gaW4gJystJzoKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMTpdCisgICAgICAgIGlmIHZhbHVlID09ICcuaW5mJzoKKyAgICAgICAgICAgIHJldHVybiBzaWduKnNlbGYuaW5mX3ZhbHVlCisgICAgICAgIGVsaWYgdmFsdWUgPT0gJy5uYW4nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFuX3ZhbHVlCisgICAgICAgIGVsaWYgJzonIGluIHZhbHVlOgorICAgICAgICAgICAgZGlnaXRzID0gW2Zsb2F0KHBhcnQpIGZvciBwYXJ0IGluIHZhbHVlLnNwbGl0KCc6JyldCisgICAgICAgICAgICBkaWdpdHMucmV2ZXJzZSgpCisgICAgICAgICAgICBiYXNlID0gMQorICAgICAgICAgICAgdmFsdWUgPSAwLjAKKyAgICAgICAgICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gZGlnaXQqYmFzZQorICAgICAgICAgICAgICAgIGJhc2UgKj0gNjAKKyAgICAgICAgICAgIHJldHVybiBzaWduKnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2lnbipmbG9hdCh2YWx1ZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9iaW5hcnkoc2VsZiwgbm9kZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpLmVuY29kZSgnYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb252ZXJ0IGJhc2U2NCBkYXRhIGludG8gYXNjaWk6ICVzIiAlIGV4YywKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKGJhc2U2NCwgJ2RlY29kZWJ5dGVzJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVieXRlcyh2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVzdHJpbmcodmFsdWUpCisgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvciBhcyBleGM6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGVjb2RlIGJhc2U2NCBkYXRhOiAlcyIgJSBleGMsIG5vZGUuc3RhcnRfbWFyaykKKworICAgIHRpbWVzdGFtcF9yZWdleHAgPSByZS5jb21waWxlKAorICAgICAgICAgICAgcicnJ14oP1A8eWVhcj5bMC05XVswLTldWzAtOV1bMC05XSkKKyAgICAgICAgICAgICAgICAtKD9QPG1vbnRoPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgIC0oP1A8ZGF5PlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgICg/Oig/OltUdF18WyBcdF0rKQorICAgICAgICAgICAgICAgICg/UDxob3VyPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgIDooP1A8bWludXRlPlswLTldWzAtOV0pCisgICAgICAgICAgICAgICAgOig/UDxzZWNvbmQ+WzAtOV1bMC05XSkKKyAgICAgICAgICAgICAgICAoPzpcLig/UDxmcmFjdGlvbj5bMC05XSopKT8KKyAgICAgICAgICAgICAgICAoPzpbIFx0XSooP1A8dHo+WnwoP1A8dHpfc2lnbj5bLStdKSg/UDx0el9ob3VyPlswLTldWzAtOV0/KQorICAgICAgICAgICAgICAgICg/OjooP1A8dHpfbWludXRlPlswLTldWzAtOV0pKT8pKT8pPyQnJycsIHJlLlgpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfdGltZXN0YW1wKHNlbGYsIG5vZGUpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorICAgICAgICBtYXRjaCA9IHNlbGYudGltZXN0YW1wX3JlZ2V4cC5tYXRjaChub2RlLnZhbHVlKQorICAgICAgICB2YWx1ZXMgPSBtYXRjaC5ncm91cGRpY3QoKQorICAgICAgICB5ZWFyID0gaW50KHZhbHVlc1sneWVhciddKQorICAgICAgICBtb250aCA9IGludCh2YWx1ZXNbJ21vbnRoJ10pCisgICAgICAgIGRheSA9IGludCh2YWx1ZXNbJ2RheSddKQorICAgICAgICBpZiBub3QgdmFsdWVzWydob3VyJ106CisgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgZGF5KQorICAgICAgICBob3VyID0gaW50KHZhbHVlc1snaG91ciddKQorICAgICAgICBtaW51dGUgPSBpbnQodmFsdWVzWydtaW51dGUnXSkKKyAgICAgICAgc2Vjb25kID0gaW50KHZhbHVlc1snc2Vjb25kJ10pCisgICAgICAgIGZyYWN0aW9uID0gMAorICAgICAgICBpZiB2YWx1ZXNbJ2ZyYWN0aW9uJ106CisgICAgICAgICAgICBmcmFjdGlvbiA9IHZhbHVlc1snZnJhY3Rpb24nXVs6Nl0KKyAgICAgICAgICAgIHdoaWxlIGxlbihmcmFjdGlvbikgPCA2OgorICAgICAgICAgICAgICAgIGZyYWN0aW9uICs9ICcwJworICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnQoZnJhY3Rpb24pCisgICAgICAgIGRlbHRhID0gTm9uZQorICAgICAgICBpZiB2YWx1ZXNbJ3R6X3NpZ24nXToKKyAgICAgICAgICAgIHR6X2hvdXIgPSBpbnQodmFsdWVzWyd0el9ob3VyJ10pCisgICAgICAgICAgICB0el9taW51dGUgPSBpbnQodmFsdWVzWyd0el9taW51dGUnXSBvciAwKQorICAgICAgICAgICAgZGVsdGEgPSBkYXRldGltZS50aW1lZGVsdGEoaG91cnM9dHpfaG91ciwgbWludXRlcz10el9taW51dGUpCisgICAgICAgICAgICBpZiB2YWx1ZXNbJ3R6X3NpZ24nXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKKyAgICAgICAgZGF0YSA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikKKyAgICAgICAgaWYgZGVsdGE6CisgICAgICAgICAgICBkYXRhIC09IGRlbHRhCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfb21hcChzZWxmLCBub2RlKToKKyAgICAgICAgIyBOb3RlOiB3ZSBkbyBub3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBrZXlzLCBiZWNhdXNlIGl0J3MgdG9vCisgICAgICAgICMgQ1BVLWV4cGVuc2l2ZS4KKyAgICAgICAgb21hcCA9IFtdCisgICAgICAgIHlpZWxkIG9tYXAKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBhbiBvcmRlcmVkIG1hcCIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2VxdWVuY2UsIGJ1dCBmb3VuZCAlcyIgJSBub2RlLmlkLCBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIGZvciBzdWJub2RlIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdWJub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGFuIG9yZGVyZWQgbWFwIiwgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgbWFwcGluZyBvZiBsZW5ndGggMSwgYnV0IGZvdW5kICVzIiAlIHN1Ym5vZGUuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJub2RlLnN0YXJ0X21hcmspCisgICAgICAgICAgICBpZiBsZW4oc3Vibm9kZS52YWx1ZSkgIT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gb3JkZXJlZCBtYXAiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzaW5nbGUgbWFwcGluZyBpdGVtLCBidXQgZm91bmQgJWQgaXRlbXMiICUgbGVuKHN1Ym5vZGUudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vibm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAga2V5X25vZGUsIHZhbHVlX25vZGUgPSBzdWJub2RlLnZhbHVlWzBdCisgICAgICAgICAgICBrZXkgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3Qoa2V5X25vZGUpCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X29iamVjdCh2YWx1ZV9ub2RlKQorICAgICAgICAgICAgb21hcC5hcHBlbmQoKGtleSwgdmFsdWUpKQorCisgICAgZGVmIGNvbnN0cnVjdF95YW1sX3BhaXJzKHNlbGYsIG5vZGUpOgorICAgICAgICAjIE5vdGU6IHRoZSBzYW1lIGNvZGUgYXMgYGNvbnN0cnVjdF95YW1sX29tYXBgLgorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIHlpZWxkIHBhaXJzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgcGFpcnMiLCBub2RlLnN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIHNlcXVlbmNlLCBidXQgZm91bmQgJXMiICUgbm9kZS5pZCwgbm9kZS5zdGFydF9tYXJrKQorICAgICAgICBmb3Igc3Vibm9kZSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3Vibm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbnN0cnVjdG9yRXJyb3IoIndoaWxlIGNvbnN0cnVjdGluZyBwYWlycyIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIG1hcHBpbmcgb2YgbGVuZ3RoIDEsIGJ1dCBmb3VuZCAlcyIgJSBzdWJub2RlLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vibm9kZS5zdGFydF9tYXJrKQorICAgICAgICAgICAgaWYgbGVuKHN1Ym5vZGUudmFsdWUpICE9IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIHBhaXJzIiwgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlIG1hcHBpbmcgaXRlbSwgYnV0IGZvdW5kICVkIGl0ZW1zIiAlIGxlbihzdWJub2RlLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGtleV9ub2RlLCB2YWx1ZV9ub2RlID0gc3Vibm9kZS52YWx1ZVswXQorICAgICAgICAgICAga2V5ID0gc2VsZi5jb25zdHJ1Y3Rfb2JqZWN0KGtleV9ub2RlKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9vYmplY3QodmFsdWVfbm9kZSkKKyAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfc2V0KHNlbGYsIG5vZGUpOgorICAgICAgICBkYXRhID0gc2V0KCkKKyAgICAgICAgeWllbGQgZGF0YQorICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X21hcHBpbmcobm9kZSkKKyAgICAgICAgZGF0YS51cGRhdGUodmFsdWUpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfc3RyKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisKKyAgICBkZWYgY29uc3RydWN0X3lhbWxfc2VxKHNlbGYsIG5vZGUpOgorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgeWllbGQgZGF0YQorICAgICAgICBkYXRhLmV4dGVuZChzZWxmLmNvbnN0cnVjdF9zZXF1ZW5jZShub2RlKSkKKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9tYXAoc2VsZiwgbm9kZSk6CisgICAgICAgIGRhdGEgPSB7fQorICAgICAgICB5aWVsZCBkYXRhCisgICAgICAgIHZhbHVlID0gc2VsZi5jb25zdHJ1Y3RfbWFwcGluZyhub2RlKQorICAgICAgICBkYXRhLnVwZGF0ZSh2YWx1ZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfeWFtbF9vYmplY3Qoc2VsZiwgbm9kZSwgY2xzKToKKyAgICAgICAgZGF0YSA9IGNscy5fX25ld19fKGNscykKKyAgICAgICAgeWllbGQgZGF0YQorICAgICAgICBpZiBoYXNhdHRyKGRhdGEsICdfX3NldHN0YXRlX18nKToKKyAgICAgICAgICAgIHN0YXRlID0gc2VsZi5jb25zdHJ1Y3RfbWFwcGluZyhub2RlLCBkZWVwPVRydWUpCisgICAgICAgICAgICBkYXRhLl9fc2V0c3RhdGVfXyhzdGF0ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRlID0gc2VsZi5jb25zdHJ1Y3RfbWFwcGluZyhub2RlKQorICAgICAgICAgICAgZGF0YS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpCisKKyAgICBkZWYgY29uc3RydWN0X3VuZGVmaW5lZChzZWxmLCBub2RlKToKKyAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZGV0ZXJtaW5lIGEgY29uc3RydWN0b3IgZm9yIHRoZSB0YWcgJXIiICUgbm9kZS50YWcsCisgICAgICAgICAgICAgICAgbm9kZS5zdGFydF9tYXJrKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9udWxsKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9ib29sKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6aW50JywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2ludCkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2Zsb2F0KQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5JywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2JpbmFyeSkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF90aW1lc3RhbXApCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX29tYXApCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9wYWlycykKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9zZXQpCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLAorICAgICAgICBTYWZlQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfc3RyKQorCitTYWZlQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6c2VxJywKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX3NlcSkKKworU2FmZUNvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9tYXApCisKK1NhZmVDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoTm9uZSwKKyAgICAgICAgU2FmZUNvbnN0cnVjdG9yLmNvbnN0cnVjdF91bmRlZmluZWQpCisKK2NsYXNzIENvbnN0cnVjdG9yKFNhZmVDb25zdHJ1Y3Rvcik6CisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9zdHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX3VuaWNvZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX2J5dGVzKHNlbGYsIG5vZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvciBhcyBleGM6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29udmVydCBiYXNlNjQgZGF0YSBpbnRvIGFzY2lpOiAlcyIgJSBleGMsCisgICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihiYXNlNjQsICdkZWNvZGVieXRlcycpOgorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2RlYnl0ZXModmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2Rlc3RyaW5nKHZhbHVlKQorICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRlY29kZSBiYXNlNjQgZGF0YTogJXMiICUgZXhjLCBub2RlLnN0YXJ0X21hcmspCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9sb25nKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3RfeWFtbF9pbnQobm9kZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX2NvbXBsZXgoc2VsZiwgbm9kZSk6CisgICAgICAgcmV0dXJuIGNvbXBsZXgoc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpKQorCisgICAgZGVmIGNvbnN0cnVjdF9weXRob25fdHVwbGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiB0dXBsZShzZWxmLmNvbnN0cnVjdF9zZXF1ZW5jZShub2RlKSkKKworICAgIGRlZiBmaW5kX3B5dGhvbl9tb2R1bGUoc2VsZiwgbmFtZSwgbWFyayk6CisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG1vZHVsZSIsIG1hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub24tZW1wdHkgbmFtZSBhcHBlbmRlZCB0byB0aGUgdGFnIiwgbWFyaykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG1vZHVsZSIsIG1hcmssCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZmluZCBtb2R1bGUgJXIgKCVzKSIgJSAobmFtZSwgZXhjKSwgbWFyaykKKyAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCisKKyAgICBkZWYgZmluZF9weXRob25fbmFtZShzZWxmLCBuYW1lLCBtYXJrKToKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBQeXRob24gb2JqZWN0IiwgbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vbi1lbXB0eSBuYW1lIGFwcGVuZGVkIHRvIHRoZSB0YWciLCBtYXJrKQorICAgICAgICBpZiAnLicgaW4gbmFtZToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lLCBvYmplY3RfbmFtZSA9IG5hbWUucnNwbGl0KCcuJywgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gJ2J1aWx0aW5zJworICAgICAgICAgICAgb2JqZWN0X25hbWUgPSBuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlX25hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBQeXRob24gb2JqZWN0IiwgbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kIG1vZHVsZSAlciAoJXMpIiAlIChtb2R1bGVfbmFtZSwgZXhjKSwgbWFyaykKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgb2JqZWN0X25hbWUpOgorICAgICAgICAgICAgcmFpc2UgQ29uc3RydWN0b3JFcnJvcigid2hpbGUgY29uc3RydWN0aW5nIGEgUHl0aG9uIG9iamVjdCIsIG1hcmssCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZmluZCAlciBpbiB0aGUgbW9kdWxlICVyIgorICAgICAgICAgICAgICAgICAgICAlIChvYmplY3RfbmFtZSwgbW9kdWxlLl9fbmFtZV9fKSwgbWFyaykKKyAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBvYmplY3RfbmFtZSkKKworICAgIGRlZiBjb25zdHJ1Y3RfcHl0aG9uX25hbWUoc2VsZiwgc3VmZml4LCBub2RlKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBQeXRob24gbmFtZSIsIG5vZGUuc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRoZSBlbXB0eSB2YWx1ZSwgYnV0IGZvdW5kICVyIiAlIHZhbHVlLCBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBzZWxmLmZpbmRfcHl0aG9uX25hbWUoc3VmZml4LCBub2RlLnN0YXJ0X21hcmspCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9tb2R1bGUoc2VsZiwgc3VmZml4LCBub2RlKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICByYWlzZSBDb25zdHJ1Y3RvckVycm9yKCJ3aGlsZSBjb25zdHJ1Y3RpbmcgYSBQeXRob24gbW9kdWxlIiwgbm9kZS5zdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdGhlIGVtcHR5IHZhbHVlLCBidXQgZm91bmQgJXIiICUgdmFsdWUsIG5vZGUuc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9weXRob25fbW9kdWxlKHN1ZmZpeCwgbm9kZS5zdGFydF9tYXJrKQorCisgICAgZGVmIG1ha2VfcHl0aG9uX2luc3RhbmNlKHNlbGYsIHN1ZmZpeCwgbm9kZSwKKyAgICAgICAgICAgIGFyZ3M9Tm9uZSwga3dkcz1Ob25lLCBuZXdvYmo9RmFsc2UpOgorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBpZiBub3Qga3dkczoKKyAgICAgICAgICAgIGt3ZHMgPSB7fQorICAgICAgICBjbHMgPSBzZWxmLmZpbmRfcHl0aG9uX25hbWUoc3VmZml4LCBub2RlLnN0YXJ0X21hcmspCisgICAgICAgIGlmIG5ld29iaiBhbmQgaXNpbnN0YW5jZShjbHMsIHR5cGUpOgorICAgICAgICAgICAgcmV0dXJuIGNscy5fX25ld19fKGNscywgKmFyZ3MsICoqa3dkcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbHMoKmFyZ3MsICoqa3dkcykKKworICAgIGRlZiBzZXRfcHl0aG9uX2luc3RhbmNlX3N0YXRlKHNlbGYsIGluc3RhbmNlLCBzdGF0ZSk6CisgICAgICAgIGlmIGhhc2F0dHIoaW5zdGFuY2UsICdfX3NldHN0YXRlX18nKToKKyAgICAgICAgICAgIGluc3RhbmNlLl9fc2V0c3RhdGVfXyhzdGF0ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNsb3RzdGF0ZSA9IHt9CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXRlLCB0dXBsZSkgYW5kIGxlbihzdGF0ZSkgPT0gMjoKKyAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGUKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoaW5zdGFuY2UsICdfX2RpY3RfXycpOgorICAgICAgICAgICAgICAgIGluc3RhbmNlLl9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKKyAgICAgICAgICAgIGVsaWYgc3RhdGU6CisgICAgICAgICAgICAgICAgc2xvdHN0YXRlLnVwZGF0ZShzdGF0ZSkKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNsb3RzdGF0ZS5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIob2JqZWN0LCBrZXksIHZhbHVlKQorCisgICAgZGVmIGNvbnN0cnVjdF9weXRob25fb2JqZWN0KHNlbGYsIHN1ZmZpeCwgbm9kZSk6CisgICAgICAgICMgRm9ybWF0OgorICAgICAgICAjICAgISFweXRob24vb2JqZWN0Om1vZHVsZS5uYW1lIHsgLi4uIHN0YXRlIC4uLiB9CisgICAgICAgIGluc3RhbmNlID0gc2VsZi5tYWtlX3B5dGhvbl9pbnN0YW5jZShzdWZmaXgsIG5vZGUsIG5ld29iaj1UcnVlKQorICAgICAgICB5aWVsZCBpbnN0YW5jZQorICAgICAgICBkZWVwID0gaGFzYXR0cihpbnN0YW5jZSwgJ19fc2V0c3RhdGVfXycpCisgICAgICAgIHN0YXRlID0gc2VsZi5jb25zdHJ1Y3RfbWFwcGluZyhub2RlLCBkZWVwPWRlZXApCisgICAgICAgIHNlbGYuc2V0X3B5dGhvbl9pbnN0YW5jZV9zdGF0ZShpbnN0YW5jZSwgc3RhdGUpCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9vYmplY3RfYXBwbHkoc2VsZiwgc3VmZml4LCBub2RlLCBuZXdvYmo9RmFsc2UpOgorICAgICAgICAjIEZvcm1hdDoKKyAgICAgICAgIyAgICEhcHl0aG9uL29iamVjdC9hcHBseSAgICAgICAjIChvciAhIXB5dGhvbi9vYmplY3QvbmV3KQorICAgICAgICAjICAgYXJnczogWyAuLi4gYXJndW1lbnRzIC4uLiBdCisgICAgICAgICMgICBrd2RzOiB7IC4uLiBrZXl3b3JkcyAuLi4gfQorICAgICAgICAjICAgc3RhdGU6IC4uLiBzdGF0ZSAuLi4KKyAgICAgICAgIyAgIGxpc3RpdGVtczogWyAuLi4gbGlzdGl0ZW1zIC4uLiBdCisgICAgICAgICMgICBkaWN0aXRlbXM6IHsgLi4uIGRpY3RpdGVtcyAuLi4gfQorICAgICAgICAjIG9yIHNob3J0IGZvcm1hdDoKKyAgICAgICAgIyAgICEhcHl0aG9uL29iamVjdC9hcHBseSBbIC4uLiBhcmd1bWVudHMgLi4uIF0KKyAgICAgICAgIyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICEhcHl0aG9uL29iamVjdC9hcHBseSBhbmQgISFweXRob24vb2JqZWN0L25ldworICAgICAgICAjIGlzIGhvdyBhbiBvYmplY3QgaXMgY3JlYXRlZCwgY2hlY2sgbWFrZV9weXRob25faW5zdGFuY2UgZm9yIGRldGFpbHMuCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgIGFyZ3MgPSBzZWxmLmNvbnN0cnVjdF9zZXF1ZW5jZShub2RlLCBkZWVwPVRydWUpCisgICAgICAgICAgICBrd2RzID0ge30KKyAgICAgICAgICAgIHN0YXRlID0ge30KKyAgICAgICAgICAgIGxpc3RpdGVtcyA9IFtdCisgICAgICAgICAgICBkaWN0aXRlbXMgPSB7fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUsIGRlZXA9VHJ1ZSkKKyAgICAgICAgICAgIGFyZ3MgPSB2YWx1ZS5nZXQoJ2FyZ3MnLCBbXSkKKyAgICAgICAgICAgIGt3ZHMgPSB2YWx1ZS5nZXQoJ2t3ZHMnLCB7fSkKKyAgICAgICAgICAgIHN0YXRlID0gdmFsdWUuZ2V0KCdzdGF0ZScsIHt9KQorICAgICAgICAgICAgbGlzdGl0ZW1zID0gdmFsdWUuZ2V0KCdsaXN0aXRlbXMnLCBbXSkKKyAgICAgICAgICAgIGRpY3RpdGVtcyA9IHZhbHVlLmdldCgnZGljdGl0ZW1zJywge30pCisgICAgICAgIGluc3RhbmNlID0gc2VsZi5tYWtlX3B5dGhvbl9pbnN0YW5jZShzdWZmaXgsIG5vZGUsIGFyZ3MsIGt3ZHMsIG5ld29iaikKKyAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICBzZWxmLnNldF9weXRob25faW5zdGFuY2Vfc3RhdGUoaW5zdGFuY2UsIHN0YXRlKQorICAgICAgICBpZiBsaXN0aXRlbXM6CisgICAgICAgICAgICBpbnN0YW5jZS5leHRlbmQobGlzdGl0ZW1zKQorICAgICAgICBpZiBkaWN0aXRlbXM6CisgICAgICAgICAgICBmb3Iga2V5IGluIGRpY3RpdGVtczoKKyAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gZGljdGl0ZW1zW2tleV0KKyAgICAgICAgcmV0dXJuIGluc3RhbmNlCisKKyAgICBkZWYgY29uc3RydWN0X3B5dGhvbl9vYmplY3RfbmV3KHNlbGYsIHN1ZmZpeCwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9weXRob25fb2JqZWN0X2FwcGx5KHN1ZmZpeCwgbm9kZSwgbmV3b2JqPVRydWUpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL25vbmUnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX251bGwpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL2Jvb2wnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF95YW1sX2Jvb2wpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL3N0cicsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl9zdHIpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL3VuaWNvZGUnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF9weXRob25fdW5pY29kZSkKKworQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vYnl0ZXMnLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF9weXRob25fYnl0ZXMpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL2ludCcsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfaW50KQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9sb25nJywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX2xvbmcpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL2Zsb2F0JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9mbG9hdCkKKworQ29uc3RydWN0b3IuYWRkX2NvbnN0cnVjdG9yKAorICAgICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vY29tcGxleCcsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl9jb21wbGV4KQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9saXN0JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9zZXEpCisKK0NvbnN0cnVjdG9yLmFkZF9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL3R1cGxlJywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX3R1cGxlKQorCitDb25zdHJ1Y3Rvci5hZGRfY29uc3RydWN0b3IoCisgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9kaWN0JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9tYXApCisKK0NvbnN0cnVjdG9yLmFkZF9tdWx0aV9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL25hbWU6JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX25hbWUpCisKK0NvbnN0cnVjdG9yLmFkZF9tdWx0aV9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL21vZHVsZTonLAorICAgIENvbnN0cnVjdG9yLmNvbnN0cnVjdF9weXRob25fbW9kdWxlKQorCitDb25zdHJ1Y3Rvci5hZGRfbXVsdGlfY29uc3RydWN0b3IoCisgICAgJ3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi9vYmplY3Q6JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX29iamVjdCkKKworQ29uc3RydWN0b3IuYWRkX211bHRpX2NvbnN0cnVjdG9yKAorICAgICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vb2JqZWN0L2FwcGx5OicsCisgICAgQ29uc3RydWN0b3IuY29uc3RydWN0X3B5dGhvbl9vYmplY3RfYXBwbHkpCisKK0NvbnN0cnVjdG9yLmFkZF9tdWx0aV9jb25zdHJ1Y3RvcigKKyAgICAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdC9uZXc6JywKKyAgICBDb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfcHl0aG9uX29iamVjdF9uZXcpCisKZGlmZiAtLWdpdCBhL2xpYjMveWFtbC9jeWFtbC5weSBiL2xpYjMveWFtbC9jeWFtbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNiODdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL2N5YW1sLnB5CkBAIC0wLDAgKzEsODUgQEAKKworX19hbGxfXyA9IFsnQ0Jhc2VMb2FkZXInLCAnQ1NhZmVMb2FkZXInLCAnQ0xvYWRlcicsCisgICAgICAgICdDQmFzZUR1bXBlcicsICdDU2FmZUR1bXBlcicsICdDRHVtcGVyJ10KKworZnJvbSBfeWFtbCBpbXBvcnQgQ1BhcnNlciwgQ0VtaXR0ZXIKKworZnJvbSAuY29uc3RydWN0b3IgaW1wb3J0ICoKKworZnJvbSAuc2VyaWFsaXplciBpbXBvcnQgKgorZnJvbSAucmVwcmVzZW50ZXIgaW1wb3J0ICoKKworZnJvbSAucmVzb2x2ZXIgaW1wb3J0ICoKKworY2xhc3MgQ0Jhc2VMb2FkZXIoQ1BhcnNlciwgQmFzZUNvbnN0cnVjdG9yLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBCYXNlQ29uc3RydWN0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgQmFzZVJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKK2NsYXNzIENTYWZlTG9hZGVyKENQYXJzZXIsIFNhZmVDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBTYWZlQ29uc3RydWN0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgQ0xvYWRlcihDUGFyc2VyLCBDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIENQYXJzZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQorICAgICAgICBDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBDQmFzZUR1bXBlcihDRW1pdHRlciwgQmFzZVJlcHJlc2VudGVyLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwKKyAgICAgICAgICAgIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUsCisgICAgICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsIGV4cGxpY2l0X3N0YXJ0PU5vbmUsIGV4cGxpY2l0X2VuZD1Ob25lLAorICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBDRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBSZXByZXNlbnRlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9mbG93X3N0eWxlPWRlZmF1bHRfZmxvd19zdHlsZSkKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgQ1NhZmVEdW1wZXIoQ0VtaXR0ZXIsIFNhZmVSZXByZXNlbnRlciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwKKyAgICAgICAgICAgIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUsCisgICAgICAgICAgICBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsIGV4cGxpY2l0X3N0YXJ0PU5vbmUsIGV4cGxpY2l0X2VuZD1Ob25lLAorICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBDRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBTYWZlUmVwcmVzZW50ZXIuX19pbml0X18oc2VsZiwgZGVmYXVsdF9zdHlsZT1kZWZhdWx0X3N0eWxlLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfZmxvd19zdHlsZT1kZWZhdWx0X2Zsb3dfc3R5bGUpCisgICAgICAgIFJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKK2NsYXNzIENEdW1wZXIoQ0VtaXR0ZXIsIFNlcmlhbGl6ZXIsIFJlcHJlc2VudGVyLCBSZXNvbHZlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLAorICAgICAgICAgICAgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSwKKyAgICAgICAgICAgIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHRhZ3M9Tm9uZSk6CisgICAgICAgIENFbWl0dGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgY2Fub25pY2FsPWNhbm9uaWNhbCwKKyAgICAgICAgICAgICAgICBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWssCisgICAgICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgIFJlcHJlc2VudGVyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9ZGVmYXVsdF9zdHlsZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2Zsb3dfc3R5bGU9ZGVmYXVsdF9mbG93X3N0eWxlKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvZHVtcGVyLnB5IGIvbGliMy95YW1sL2R1bXBlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY5MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL2R1bXBlci5weQpAQCAtMCwwICsxLDYyIEBACisKK19fYWxsX18gPSBbJ0Jhc2VEdW1wZXInLCAnU2FmZUR1bXBlcicsICdEdW1wZXInXQorCitmcm9tIC5lbWl0dGVyIGltcG9ydCAqCitmcm9tIC5zZXJpYWxpemVyIGltcG9ydCAqCitmcm9tIC5yZXByZXNlbnRlciBpbXBvcnQgKgorZnJvbSAucmVzb2x2ZXIgaW1wb3J0ICoKKworY2xhc3MgQmFzZUR1bXBlcihFbWl0dGVyLCBTZXJpYWxpemVyLCBCYXNlUmVwcmVzZW50ZXIsIEJhc2VSZXNvbHZlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLAorICAgICAgICAgICAgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSwKKyAgICAgICAgICAgIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHRhZ3M9Tm9uZSk6CisgICAgICAgIEVtaXR0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBjYW5vbmljYWw9Y2Fub25pY2FsLAorICAgICAgICAgICAgICAgIGluZGVudD1pbmRlbnQsIHdpZHRoPXdpZHRoLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrKQorICAgICAgICBTZXJpYWxpemVyLl9faW5pdF9fKHNlbGYsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBSZXByZXNlbnRlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9mbG93X3N0eWxlPWRlZmF1bHRfZmxvd19zdHlsZSkKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgU2FmZUR1bXBlcihFbWl0dGVyLCBTZXJpYWxpemVyLCBTYWZlUmVwcmVzZW50ZXIsIFJlc29sdmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sCisgICAgICAgICAgICBkZWZhdWx0X3N0eWxlPU5vbmUsIGRlZmF1bHRfZmxvd19zdHlsZT1Ob25lLAorICAgICAgICAgICAgY2Fub25pY2FsPU5vbmUsIGluZGVudD1Ob25lLCB3aWR0aD1Ob25lLAorICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1Ob25lLCBsaW5lX2JyZWFrPU5vbmUsCisgICAgICAgICAgICBlbmNvZGluZz1Ob25lLCBleHBsaWNpdF9zdGFydD1Ob25lLCBleHBsaWNpdF9lbmQ9Tm9uZSwKKyAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgRW1pdHRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGNhbm9uaWNhbD1jYW5vbmljYWwsCisgICAgICAgICAgICAgICAgaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsCisgICAgICAgICAgICAgICAgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlLCBsaW5lX2JyZWFrPWxpbmVfYnJlYWspCisgICAgICAgIFNlcmlhbGl6ZXIuX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9ZXhwbGljaXRfc3RhcnQsIGV4cGxpY2l0X2VuZD1leHBsaWNpdF9lbmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLCB0YWdzPXRhZ3MpCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9mbG93X3N0eWxlPWRlZmF1bHRfZmxvd19zdHlsZSkKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgRHVtcGVyKEVtaXR0ZXIsIFNlcmlhbGl6ZXIsIFJlcHJlc2VudGVyLCBSZXNvbHZlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLAorICAgICAgICAgICAgZGVmYXVsdF9zdHlsZT1Ob25lLCBkZWZhdWx0X2Zsb3dfc3R5bGU9Tm9uZSwKKyAgICAgICAgICAgIGNhbm9uaWNhbD1Ob25lLCBpbmRlbnQ9Tm9uZSwgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9Tm9uZSwgbGluZV9icmVhaz1Ob25lLAorICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsCisgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHRhZ3M9Tm9uZSk6CisgICAgICAgIEVtaXR0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBjYW5vbmljYWw9Y2Fub25pY2FsLAorICAgICAgICAgICAgICAgIGluZGVudD1pbmRlbnQsIHdpZHRoPXdpZHRoLAorICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgbGluZV9icmVhaz1saW5lX2JyZWFrKQorICAgICAgICBTZXJpYWxpemVyLl9faW5pdF9fKHNlbGYsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3N0YXJ0PWV4cGxpY2l0X3N0YXJ0LCBleHBsaWNpdF9lbmQ9ZXhwbGljaXRfZW5kLAorICAgICAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICBSZXByZXNlbnRlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0X3N0eWxlPWRlZmF1bHRfc3R5bGUsCisgICAgICAgICAgICAgICAgZGVmYXVsdF9mbG93X3N0eWxlPWRlZmF1bHRfZmxvd19zdHlsZSkKKyAgICAgICAgUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKwpkaWZmIC0tZ2l0IGEvbGliMy95YW1sL2VtaXR0ZXIucHkgYi9saWIzL3lhbWwvZW1pdHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNiMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL2VtaXR0ZXIucHkKQEAgLTAsMCArMSwxMTM3IEBACisKKyMgRW1pdHRlciBleHBlY3RzIGV2ZW50cyBvYmV5aW5nIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKyMgc3RyZWFtIDo6PSBTVFJFQU0tU1RBUlQgZG9jdW1lbnQqIFNUUkVBTS1FTkQKKyMgZG9jdW1lbnQgOjo9IERPQ1VNRU5ULVNUQVJUIG5vZGUgRE9DVU1FTlQtRU5ECisjIG5vZGUgOjo9IFNDQUxBUiB8IHNlcXVlbmNlIHwgbWFwcGluZworIyBzZXF1ZW5jZSA6Oj0gU0VRVUVOQ0UtU1RBUlQgbm9kZSogU0VRVUVOQ0UtRU5ECisjIG1hcHBpbmcgOjo9IE1BUFBJTkctU1RBUlQgKG5vZGUgbm9kZSkqIE1BUFBJTkctRU5ECisKK19fYWxsX18gPSBbJ0VtaXR0ZXInLCAnRW1pdHRlckVycm9yJ10KKworZnJvbSAuZXJyb3IgaW1wb3J0IFlBTUxFcnJvcgorZnJvbSAuZXZlbnRzIGltcG9ydCAqCisKK2NsYXNzIEVtaXR0ZXJFcnJvcihZQU1MRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgU2NhbGFyQW5hbHlzaXM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjYWxhciwgZW1wdHksIG11bHRpbGluZSwKKyAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW4sIGFsbG93X2Jsb2NrX3BsYWluLAorICAgICAgICAgICAgYWxsb3dfc2luZ2xlX3F1b3RlZCwgYWxsb3dfZG91YmxlX3F1b3RlZCwKKyAgICAgICAgICAgIGFsbG93X2Jsb2NrKToKKyAgICAgICAgc2VsZi5zY2FsYXIgPSBzY2FsYXIKKyAgICAgICAgc2VsZi5lbXB0eSA9IGVtcHR5CisgICAgICAgIHNlbGYubXVsdGlsaW5lID0gbXVsdGlsaW5lCisgICAgICAgIHNlbGYuYWxsb3dfZmxvd19wbGFpbiA9IGFsbG93X2Zsb3dfcGxhaW4KKyAgICAgICAgc2VsZi5hbGxvd19ibG9ja19wbGFpbiA9IGFsbG93X2Jsb2NrX3BsYWluCisgICAgICAgIHNlbGYuYWxsb3dfc2luZ2xlX3F1b3RlZCA9IGFsbG93X3NpbmdsZV9xdW90ZWQKKyAgICAgICAgc2VsZi5hbGxvd19kb3VibGVfcXVvdGVkID0gYWxsb3dfZG91YmxlX3F1b3RlZAorICAgICAgICBzZWxmLmFsbG93X2Jsb2NrID0gYWxsb3dfYmxvY2sKKworY2xhc3MgRW1pdHRlcjoKKworICAgIERFRkFVTFRfVEFHX1BSRUZJWEVTID0geworICAgICAgICAnIScgOiAnIScsCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjonIDogJyEhJywKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBjYW5vbmljYWw9Tm9uZSwgaW5kZW50PU5vbmUsIHdpZHRoPU5vbmUsCisgICAgICAgICAgICBhbGxvd191bmljb2RlPU5vbmUsIGxpbmVfYnJlYWs9Tm9uZSk6CisKKyAgICAgICAgIyBUaGUgc3RyZWFtIHNob3VsZCBoYXZlIHRoZSBtZXRob2RzIGB3cml0ZWAgYW5kIHBvc3NpYmx5IGBmbHVzaGAuCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisKKyAgICAgICAgIyBFbmNvZGluZyBjYW4gYmUgb3ZlcnJpZGVuIGJ5IFNUUkVBTS1TVEFSVC4KKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKKworICAgICAgICAjIEVtaXR0ZXIgaXMgYSBzdGF0ZSBtYWNoaW5lIHdpdGggYSBzdGFjayBvZiBzdGF0ZXMgdG8gaGFuZGxlIG5lc3RlZAorICAgICAgICAjIHN0cnVjdHVyZXMuCisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZXhwZWN0X3N0cmVhbV9zdGFydAorCisgICAgICAgICMgQ3VycmVudCBldmVudCBhbmQgdGhlIGV2ZW50IHF1ZXVlLgorICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisgICAgICAgIHNlbGYuZXZlbnQgPSBOb25lCisKKyAgICAgICAgIyBUaGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgdGhlIHN0YWNrIG9mIHByZXZpb3VzIGluZGVudHMuCisgICAgICAgIHNlbGYuaW5kZW50cyA9IFtdCisgICAgICAgIHNlbGYuaW5kZW50ID0gTm9uZQorCisgICAgICAgICMgRmxvdyBsZXZlbC4KKyAgICAgICAgc2VsZi5mbG93X2xldmVsID0gMAorCisgICAgICAgICMgQ29udGV4dHMuCisgICAgICAgIHNlbGYucm9vdF9jb250ZXh0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9jb250ZXh0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5tYXBwaW5nX2NvbnRleHQgPSBGYWxzZQorICAgICAgICBzZWxmLnNpbXBsZV9rZXlfY29udGV4dCA9IEZhbHNlCisKKyAgICAgICAgIyBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGxhc3QgZW1pdHRlZCBjaGFyYWN0ZXI6CisgICAgICAgICMgIC0gY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgIyAgLSBpcyBpdCBhIHdoaXRlc3BhY2U/CisgICAgICAgICMgIC0gaXMgaXQgYW4gaW5kZW50aW9uIGNoYXJhY3RlcgorICAgICAgICAjICAgIChpbmRlbnRhdGlvbiBzcGFjZSwgJy0nLCAnPycsIG9yICc6Jyk/CisgICAgICAgIHNlbGYubGluZSA9IDAKKyAgICAgICAgc2VsZi5jb2x1bW4gPSAwCisgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IFRydWUKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBUcnVlCisKKyAgICAgICAgIyBXaGV0aGVyIHRoZSBkb2N1bWVudCByZXF1aXJlcyBhbiBleHBsaWNpdCBkb2N1bWVudCBpbmRpY2F0b3IKKyAgICAgICAgc2VsZi5vcGVuX2VuZGVkID0gRmFsc2UKKworICAgICAgICAjIEZvcm1hdHRpbmcgZGV0YWlscy4KKyAgICAgICAgc2VsZi5jYW5vbmljYWwgPSBjYW5vbmljYWwKKyAgICAgICAgc2VsZi5hbGxvd191bmljb2RlID0gYWxsb3dfdW5pY29kZQorICAgICAgICBzZWxmLmJlc3RfaW5kZW50ID0gMgorICAgICAgICBpZiBpbmRlbnQgYW5kIDEgPCBpbmRlbnQgPCAxMDoKKyAgICAgICAgICAgIHNlbGYuYmVzdF9pbmRlbnQgPSBpbmRlbnQKKyAgICAgICAgc2VsZi5iZXN0X3dpZHRoID0gODAKKyAgICAgICAgaWYgd2lkdGggYW5kIHdpZHRoID4gc2VsZi5iZXN0X2luZGVudCoyOgorICAgICAgICAgICAgc2VsZi5iZXN0X3dpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5iZXN0X2xpbmVfYnJlYWsgPSAnXG4nCisgICAgICAgIGlmIGxpbmVfYnJlYWsgaW4gWydccicsICdcbicsICdcclxuJ106CisgICAgICAgICAgICBzZWxmLmJlc3RfbGluZV9icmVhayA9IGxpbmVfYnJlYWsKKworICAgICAgICAjIFRhZyBwcmVmaXhlcy4KKyAgICAgICAgc2VsZi50YWdfcHJlZml4ZXMgPSBOb25lCisKKyAgICAgICAgIyBQcmVwYXJlZCBhbmNob3IgYW5kIHRhZy4KKyAgICAgICAgc2VsZi5wcmVwYXJlZF9hbmNob3IgPSBOb25lCisgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gTm9uZQorCisgICAgICAgICMgU2NhbGFyIGFuYWx5c2lzIGFuZCBzdHlsZS4KKyAgICAgICAgc2VsZi5hbmFseXNpcyA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHlsZSA9IE5vbmUKKworICAgIGRlZiBkaXNwb3NlKHNlbGYpOgorICAgICAgICAjIFJlc2V0IHRoZSBzdGF0ZSBhdHRyaWJ1dGVzICh0byBjbGVhciBzZWxmLXJlZmVyZW5jZXMpCisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKKworICAgIGRlZiBlbWl0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKGV2ZW50KQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5uZWVkX21vcmVfZXZlbnRzKCk6CisgICAgICAgICAgICBzZWxmLmV2ZW50ID0gc2VsZi5ldmVudHMucG9wKDApCisgICAgICAgICAgICBzZWxmLnN0YXRlKCkKKyAgICAgICAgICAgIHNlbGYuZXZlbnQgPSBOb25lCisKKyAgICAjIEluIHNvbWUgY2FzZXMsIHdlIHdhaXQgZm9yIGEgZmV3IG5leHQgZXZlbnRzIGJlZm9yZSBlbWl0dGluZy4KKworICAgIGRlZiBuZWVkX21vcmVfZXZlbnRzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5ldmVudHM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBldmVudCA9IHNlbGYuZXZlbnRzWzBdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIERvY3VtZW50U3RhcnRFdmVudCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZWVkX2V2ZW50cygxKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIFNlcXVlbmNlU3RhcnRFdmVudCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZWVkX2V2ZW50cygyKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIE1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5lZWRfZXZlbnRzKDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBuZWVkX2V2ZW50cyhzZWxmLCBjb3VudCk6CisgICAgICAgIGxldmVsID0gMAorICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5ldmVudHNbMTpdOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKERvY3VtZW50U3RhcnRFdmVudCwgQ29sbGVjdGlvblN0YXJ0RXZlbnQpKToKKyAgICAgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIChEb2N1bWVudEVuZEV2ZW50LCBDb2xsZWN0aW9uRW5kRXZlbnQpKToKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIFN0cmVhbUVuZEV2ZW50KToKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC0xCisgICAgICAgICAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiAobGVuKHNlbGYuZXZlbnRzKSA8IGNvdW50KzEpCisKKyAgICBkZWYgaW5jcmVhc2VfaW5kZW50KHNlbGYsIGZsb3c9RmFsc2UsIGluZGVudGxlc3M9RmFsc2UpOgorICAgICAgICBzZWxmLmluZGVudHMuYXBwZW5kKHNlbGYuaW5kZW50KQorICAgICAgICBpZiBzZWxmLmluZGVudCBpcyBOb25lOgorICAgICAgICAgICAgaWYgZmxvdzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuYmVzdF9pbmRlbnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSAwCisgICAgICAgIGVsaWYgbm90IGluZGVudGxlc3M6CisgICAgICAgICAgICBzZWxmLmluZGVudCArPSBzZWxmLmJlc3RfaW5kZW50CisKKyAgICAjIFN0YXRlcy4KKworICAgICMgU3RyZWFtIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9zdHJlYW1fc3RhcnQoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU3RyZWFtU3RhcnRFdmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LmVuY29kaW5nIGFuZCBub3QgaGFzYXR0cihzZWxmLnN0cmVhbSwgJ2VuY29kaW5nJyk6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IHNlbGYuZXZlbnQuZW5jb2RpbmcKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyZWFtX3N0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9kb2N1bWVudF9zdGFydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJleHBlY3RlZCBTdHJlYW1TdGFydEV2ZW50LCBidXQgZ290ICVzIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuZXZlbnQpCisKKyAgICBkZWYgZXhwZWN0X25vdGhpbmcoc2VsZik6CisgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiZXhwZWN0ZWQgbm90aGluZywgYnV0IGdvdCAlcyIgJSBzZWxmLmV2ZW50KQorCisgICAgIyBEb2N1bWVudCBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3RfZmlyc3RfZG9jdW1lbnRfc3RhcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdF9kb2N1bWVudF9zdGFydChmaXJzdD1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9kb2N1bWVudF9zdGFydChzZWxmLCBmaXJzdD1GYWxzZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRTdGFydEV2ZW50KToKKyAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50LnZlcnNpb24gb3Igc2VsZi5ldmVudC50YWdzKSBhbmQgc2VsZi5vcGVuX2VuZGVkOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCcuLi4nLCBUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIGlmIHNlbGYuZXZlbnQudmVyc2lvbjoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX3RleHQgPSBzZWxmLnByZXBhcmVfdmVyc2lvbihzZWxmLmV2ZW50LnZlcnNpb24pCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV92ZXJzaW9uX2RpcmVjdGl2ZSh2ZXJzaW9uX3RleHQpCisgICAgICAgICAgICBzZWxmLnRhZ19wcmVmaXhlcyA9IHNlbGYuREVGQVVMVF9UQUdfUFJFRklYRVMuY29weSgpCisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LnRhZ3M6CisgICAgICAgICAgICAgICAgaGFuZGxlcyA9IHNvcnRlZChzZWxmLmV2ZW50LnRhZ3Mua2V5cygpKQorICAgICAgICAgICAgICAgIGZvciBoYW5kbGUgaW4gaGFuZGxlczoKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gc2VsZi5ldmVudC50YWdzW2hhbmRsZV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfcHJlZml4ZXNbcHJlZml4XSA9IGhhbmRsZQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdGV4dCA9IHNlbGYucHJlcGFyZV90YWdfaGFuZGxlKGhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3RleHQgPSBzZWxmLnByZXBhcmVfdGFnX3ByZWZpeChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfdGFnX2RpcmVjdGl2ZShoYW5kbGVfdGV4dCwgcHJlZml4X3RleHQpCisgICAgICAgICAgICBpbXBsaWNpdCA9IChmaXJzdCBhbmQgbm90IHNlbGYuZXZlbnQuZXhwbGljaXQgYW5kIG5vdCBzZWxmLmNhbm9uaWNhbAorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuZXZlbnQudmVyc2lvbiBhbmQgbm90IHNlbGYuZXZlbnQudGFncworICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuY2hlY2tfZW1wdHlfZG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGlmIG5vdCBpbXBsaWNpdDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJy0tLScsIFRydWUpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYW5vbmljYWw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9kb2N1bWVudF9yb290CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTdHJlYW1FbmRFdmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLm9wZW5fZW5kZWQ6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJy4uLicsIFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJlYW1fZW5kKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9ub3RoaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoImV4cGVjdGVkIERvY3VtZW50U3RhcnRFdmVudCwgYnV0IGdvdCAlcyIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLmV2ZW50KQorCisgICAgZGVmIGV4cGVjdF9kb2N1bWVudF9lbmQoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRFbmRFdmVudCk6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBpZiBzZWxmLmV2ZW50LmV4cGxpY2l0OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCcuLi4nLCBUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIHNlbGYuZmx1c2hfc3RyZWFtKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9kb2N1bWVudF9zdGFydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJleHBlY3RlZCBEb2N1bWVudEVuZEV2ZW50LCBidXQgZ290ICVzIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuZXZlbnQpCisKKyAgICBkZWYgZXhwZWN0X2RvY3VtZW50X3Jvb3Qoc2VsZik6CisgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9kb2N1bWVudF9lbmQpCisgICAgICAgIHNlbGYuZXhwZWN0X25vZGUocm9vdD1UcnVlKQorCisgICAgIyBOb2RlIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9ub2RlKHNlbGYsIHJvb3Q9RmFsc2UsIHNlcXVlbmNlPUZhbHNlLCBtYXBwaW5nPUZhbHNlLAorICAgICAgICAgICAgc2ltcGxlX2tleT1GYWxzZSk6CisgICAgICAgIHNlbGYucm9vdF9jb250ZXh0ID0gcm9vdAorICAgICAgICBzZWxmLnNlcXVlbmNlX2NvbnRleHQgPSBzZXF1ZW5jZQorICAgICAgICBzZWxmLm1hcHBpbmdfY29udGV4dCA9IG1hcHBpbmcKKyAgICAgICAgc2VsZi5zaW1wbGVfa2V5X2NvbnRleHQgPSBzaW1wbGVfa2V5CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgQWxpYXNFdmVudCk6CisgICAgICAgICAgICBzZWxmLmV4cGVjdF9hbGlhcygpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCAoU2NhbGFyRXZlbnQsIENvbGxlY3Rpb25TdGFydEV2ZW50KSk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfYW5jaG9yKCcmJykKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc190YWcoKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTY2FsYXJFdmVudCk6CisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3Rfc2NhbGFyKCkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTZXF1ZW5jZVN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbCBvciBzZWxmLmNhbm9uaWNhbCBvciBzZWxmLmV2ZW50LmZsb3dfc3R5bGUgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmNoZWNrX2VtcHR5X3NlcXVlbmNlKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X2Zsb3dfc2VxdWVuY2UoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X2Jsb2NrX3NlcXVlbmNlKCkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBNYXBwaW5nU3RhcnRFdmVudCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mbG93X2xldmVsIG9yIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuZXZlbnQuZmxvd19zdHlsZSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuY2hlY2tfZW1wdHlfbWFwcGluZygpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdF9mbG93X21hcHBpbmcoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X2Jsb2NrX21hcHBpbmcoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJleHBlY3RlZCBOb2RlRXZlbnQsIGJ1dCBnb3QgJXMiICUgc2VsZi5ldmVudCkKKworICAgIGRlZiBleHBlY3RfYWxpYXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZXZlbnQuYW5jaG9yIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoImFuY2hvciBpcyBub3Qgc3BlY2lmaWVkIGZvciBhbGlhcyIpCisgICAgICAgIHNlbGYucHJvY2Vzc19hbmNob3IoJyonKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKworICAgIGRlZiBleHBlY3Rfc2NhbGFyKHNlbGYpOgorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PVRydWUpCisgICAgICAgIHNlbGYucHJvY2Vzc19zY2FsYXIoKQorICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50cy5wb3AoKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKworICAgICMgRmxvdyBzZXF1ZW5jZSBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3RfZmxvd19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJ1snLCBUcnVlLCB3aGl0ZXNwYWNlPVRydWUpCisgICAgICAgIHNlbGYuZmxvd19sZXZlbCArPSAxCisgICAgICAgIHNlbGYuaW5jcmVhc2VfaW5kZW50KGZsb3c9VHJ1ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZXhwZWN0X2ZpcnN0X2Zsb3dfc2VxdWVuY2VfaXRlbQorCisgICAgZGVmIGV4cGVjdF9maXJzdF9mbG93X3NlcXVlbmNlX2l0ZW0oc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2VxdWVuY2VFbmRFdmVudCk6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgc2VsZi5mbG93X2xldmVsIC09IDEKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCddJywgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY2Fub25pY2FsIG9yIHNlbGYuY29sdW1uID4gc2VsZi5iZXN0X3dpZHRoOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9mbG93X3NlcXVlbmNlX2l0ZW0pCisgICAgICAgICAgICBzZWxmLmV4cGVjdF9ub2RlKHNlcXVlbmNlPVRydWUpCisKKyAgICBkZWYgZXhwZWN0X2Zsb3dfc2VxdWVuY2VfaXRlbShzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTZXF1ZW5jZUVuZEV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnRzLnBvcCgpCisgICAgICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgLT0gMQorICAgICAgICAgICAgaWYgc2VsZi5jYW5vbmljYWw6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJywnLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignXScsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignLCcsIEZhbHNlKQorICAgICAgICAgICAgaWYgc2VsZi5jYW5vbmljYWwgb3Igc2VsZi5jb2x1bW4gPiBzZWxmLmJlc3Rfd2lkdGg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfc2VxdWVuY2VfaXRlbSkKKyAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUoc2VxdWVuY2U9VHJ1ZSkKKworICAgICMgRmxvdyBtYXBwaW5nIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9mbG93X21hcHBpbmcoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCd7JywgVHJ1ZSwgd2hpdGVzcGFjZT1UcnVlKQorICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgKz0gMQorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PVRydWUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmV4cGVjdF9maXJzdF9mbG93X21hcHBpbmdfa2V5CisKKyAgICBkZWYgZXhwZWN0X2ZpcnN0X2Zsb3dfbWFwcGluZ19rZXkoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgTWFwcGluZ0VuZEV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnRzLnBvcCgpCisgICAgICAgICAgICBzZWxmLmZsb3dfbGV2ZWwgLT0gMQorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJ30nLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jYW5vbmljYWwgb3Igc2VsZi5jb2x1bW4gPiBzZWxmLmJlc3Rfd2lkdGg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2Fub25pY2FsIGFuZCBzZWxmLmNoZWNrX3NpbXBsZV9rZXkoKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX3NpbXBsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdF9ub2RlKG1hcHBpbmc9VHJ1ZSwgc2ltcGxlX2tleT1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignPycsIFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZ192YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdF9ub2RlKG1hcHBpbmc9VHJ1ZSkKKworICAgIGRlZiBleHBlY3RfZmxvd19tYXBwaW5nX2tleShzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBNYXBwaW5nRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuZmxvd19sZXZlbCAtPSAxCisgICAgICAgICAgICBpZiBzZWxmLmNhbm9uaWNhbDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignLCcsIEZhbHNlKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCd9JywgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCcsJywgRmFsc2UpCisgICAgICAgICAgICBpZiBzZWxmLmNhbm9uaWNhbCBvciBzZWxmLmNvbHVtbiA+IHNlbGYuYmVzdF93aWR0aDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jYW5vbmljYWwgYW5kIHNlbGYuY2hlY2tfc2ltcGxlX2tleSgpOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9mbG93X21hcHBpbmdfc2ltcGxlX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlLCBzaW1wbGVfa2V5PVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCc/JywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9mbG93X21hcHBpbmdfc2ltcGxlX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignOicsIEZhbHNlKQorICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfZmxvd19tYXBwaW5nX2tleSkKKyAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICBkZWYgZXhwZWN0X2Zsb3dfbWFwcGluZ192YWx1ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jYW5vbmljYWwgb3Igc2VsZi5jb2x1bW4gPiBzZWxmLmJlc3Rfd2lkdGg6CisgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCc6JywgVHJ1ZSkKKyAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Zsb3dfbWFwcGluZ19rZXkpCisgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgIyBCbG9jayBzZXF1ZW5jZSBoYW5kbGVycy4KKworICAgIGRlZiBleHBlY3RfYmxvY2tfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGluZGVudGxlc3MgPSAoc2VsZi5tYXBwaW5nX2NvbnRleHQgYW5kIG5vdCBzZWxmLmluZGVudGlvbikKKyAgICAgICAgc2VsZi5pbmNyZWFzZV9pbmRlbnQoZmxvdz1GYWxzZSwgaW5kZW50bGVzcz1pbmRlbnRsZXNzKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5leHBlY3RfZmlyc3RfYmxvY2tfc2VxdWVuY2VfaXRlbQorCisgICAgZGVmIGV4cGVjdF9maXJzdF9ibG9ja19zZXF1ZW5jZV9pdGVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHBlY3RfYmxvY2tfc2VxdWVuY2VfaXRlbShmaXJzdD1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9ibG9ja19zZXF1ZW5jZV9pdGVtKHNlbGYsIGZpcnN0PUZhbHNlKToKKyAgICAgICAgaWYgbm90IGZpcnN0IGFuZCBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJy0nLCBUcnVlLCBpbmRlbnRpb249VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19zZXF1ZW5jZV9pdGVtKQorICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShzZXF1ZW5jZT1UcnVlKQorCisgICAgIyBCbG9jayBtYXBwaW5nIGhhbmRsZXJzLgorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmluY3JlYXNlX2luZGVudChmbG93PUZhbHNlKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5leHBlY3RfZmlyc3RfYmxvY2tfbWFwcGluZ19rZXkKKworICAgIGRlZiBleHBlY3RfZmlyc3RfYmxvY2tfbWFwcGluZ19rZXkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX2tleShmaXJzdD1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nX2tleShzZWxmLCBmaXJzdD1GYWxzZSk6CisgICAgICAgIGlmIG5vdCBmaXJzdCBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBNYXBwaW5nRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudHMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja19zaW1wbGVfa2V5KCk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Jsb2NrX21hcHBpbmdfc2ltcGxlX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlLCBzaW1wbGVfa2V5PVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCc/JywgVHJ1ZSwgaW5kZW50aW9uPVRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYuZXhwZWN0X2Jsb2NrX21hcHBpbmdfdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICBkZWYgZXhwZWN0X2Jsb2NrX21hcHBpbmdfc2ltcGxlX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignOicsIEZhbHNlKQorICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5leHBlY3RfYmxvY2tfbWFwcGluZ19rZXkpCisgICAgICAgIHNlbGYuZXhwZWN0X25vZGUobWFwcGluZz1UcnVlKQorCisgICAgZGVmIGV4cGVjdF9ibG9ja19tYXBwaW5nX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKCc6JywgVHJ1ZSwgaW5kZW50aW9uPVRydWUpCisgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLmV4cGVjdF9ibG9ja19tYXBwaW5nX2tleSkKKyAgICAgICAgc2VsZi5leHBlY3Rfbm9kZShtYXBwaW5nPVRydWUpCisKKyAgICAjIENoZWNrZXJzLgorCisgICAgZGVmIGNoZWNrX2VtcHR5X3NlcXVlbmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2VxdWVuY2VTdGFydEV2ZW50KSBhbmQgc2VsZi5ldmVudHMKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50c1swXSwgU2VxdWVuY2VFbmRFdmVudCkpCisKKyAgICBkZWYgY2hlY2tfZW1wdHlfbWFwcGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChpc2luc3RhbmNlKHNlbGYuZXZlbnQsIE1hcHBpbmdTdGFydEV2ZW50KSBhbmQgc2VsZi5ldmVudHMKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzZWxmLmV2ZW50c1swXSwgTWFwcGluZ0VuZEV2ZW50KSkKKworICAgIGRlZiBjaGVja19lbXB0eV9kb2N1bWVudChzZWxmKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgRG9jdW1lbnRTdGFydEV2ZW50KSBvciBub3Qgc2VsZi5ldmVudHM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXZlbnQgPSBzZWxmLmV2ZW50c1swXQorICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2UoZXZlbnQsIFNjYWxhckV2ZW50KSBhbmQgZXZlbnQuYW5jaG9yIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZXZlbnQudGFnIGlzIE5vbmUgYW5kIGV2ZW50LmltcGxpY2l0IGFuZCBldmVudC52YWx1ZSA9PSAnJykKKworICAgIGRlZiBjaGVja19zaW1wbGVfa2V5KHNlbGYpOgorICAgICAgICBsZW5ndGggPSAwCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgTm9kZUV2ZW50KSBhbmQgc2VsZi5ldmVudC5hbmNob3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnByZXBhcmVkX2FuY2hvciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZWRfYW5jaG9yID0gc2VsZi5wcmVwYXJlX2FuY2hvcihzZWxmLmV2ZW50LmFuY2hvcikKKyAgICAgICAgICAgIGxlbmd0aCArPSBsZW4oc2VsZi5wcmVwYXJlZF9hbmNob3IpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgKFNjYWxhckV2ZW50LCBDb2xsZWN0aW9uU3RhcnRFdmVudCkpICBcCisgICAgICAgICAgICAgICAgYW5kIHNlbGYuZXZlbnQudGFnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF90YWcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVkX3RhZyA9IHNlbGYucHJlcGFyZV90YWcoc2VsZi5ldmVudC50YWcpCisgICAgICAgICAgICBsZW5ndGggKz0gbGVuKHNlbGYucHJlcGFyZWRfdGFnKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnQsIFNjYWxhckV2ZW50KToKKyAgICAgICAgICAgIGlmIHNlbGYuYW5hbHlzaXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFuYWx5c2lzID0gc2VsZi5hbmFseXplX3NjYWxhcihzZWxmLmV2ZW50LnZhbHVlKQorICAgICAgICAgICAgbGVuZ3RoICs9IGxlbihzZWxmLmFuYWx5c2lzLnNjYWxhcikKKyAgICAgICAgcmV0dXJuIChsZW5ndGggPCAxMjggYW5kIChpc2luc3RhbmNlKHNlbGYuZXZlbnQsIEFsaWFzRXZlbnQpCisgICAgICAgICAgICBvciAoaXNpbnN0YW5jZShzZWxmLmV2ZW50LCBTY2FsYXJFdmVudCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmFuYWx5c2lzLmVtcHR5IGFuZCBub3Qgc2VsZi5hbmFseXNpcy5tdWx0aWxpbmUpCisgICAgICAgICAgICBvciBzZWxmLmNoZWNrX2VtcHR5X3NlcXVlbmNlKCkgb3Igc2VsZi5jaGVja19lbXB0eV9tYXBwaW5nKCkpKQorCisgICAgIyBBbmNob3IsIFRhZywgYW5kIFNjYWxhciBwcm9jZXNzb3JzLgorCisgICAgZGVmIHByb2Nlc3NfYW5jaG9yKHNlbGYsIGluZGljYXRvcik6CisgICAgICAgIGlmIHNlbGYuZXZlbnQuYW5jaG9yIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZXBhcmVkX2FuY2hvciA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnByZXBhcmVkX2FuY2hvciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmVwYXJlZF9hbmNob3IgPSBzZWxmLnByZXBhcmVfYW5jaG9yKHNlbGYuZXZlbnQuYW5jaG9yKQorICAgICAgICBpZiBzZWxmLnByZXBhcmVkX2FuY2hvcjoKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kaWNhdG9yKGluZGljYXRvcitzZWxmLnByZXBhcmVkX2FuY2hvciwgVHJ1ZSkKKyAgICAgICAgc2VsZi5wcmVwYXJlZF9hbmNob3IgPSBOb25lCisKKyAgICBkZWYgcHJvY2Vzc190YWcoc2VsZik6CisgICAgICAgIHRhZyA9IHNlbGYuZXZlbnQudGFnCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5ldmVudCwgU2NhbGFyRXZlbnQpOgorICAgICAgICAgICAgaWYgc2VsZi5zdHlsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3R5bGUgPSBzZWxmLmNob29zZV9zY2FsYXJfc3R5bGUoKQorICAgICAgICAgICAgaWYgKChub3Qgc2VsZi5jYW5vbmljYWwgb3IgdGFnIGlzIE5vbmUpIGFuZAorICAgICAgICAgICAgICAgICgoc2VsZi5zdHlsZSA9PSAnJyBhbmQgc2VsZi5ldmVudC5pbXBsaWNpdFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIChzZWxmLnN0eWxlICE9ICcnIGFuZCBzZWxmLmV2ZW50LmltcGxpY2l0WzFdKSkpOgorICAgICAgICAgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgc2VsZi5ldmVudC5pbXBsaWNpdFswXSBhbmQgdGFnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdGFnID0gJyEnCisgICAgICAgICAgICAgICAgc2VsZi5wcmVwYXJlZF90YWcgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAobm90IHNlbGYuY2Fub25pY2FsIG9yIHRhZyBpcyBOb25lKSBhbmQgc2VsZi5ldmVudC5pbXBsaWNpdDoKKyAgICAgICAgICAgICAgICBzZWxmLnByZXBhcmVkX3RhZyA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdGFnIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoInRhZyBpcyBub3Qgc3BlY2lmaWVkIikKKyAgICAgICAgaWYgc2VsZi5wcmVwYXJlZF90YWcgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gc2VsZi5wcmVwYXJlX3RhZyh0YWcpCisgICAgICAgIGlmIHNlbGYucHJlcGFyZWRfdGFnOgorICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3Ioc2VsZi5wcmVwYXJlZF90YWcsIFRydWUpCisgICAgICAgIHNlbGYucHJlcGFyZWRfdGFnID0gTm9uZQorCisgICAgZGVmIGNob29zZV9zY2FsYXJfc3R5bGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYW5hbHlzaXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5hbHlzaXMgPSBzZWxmLmFuYWx5emVfc2NhbGFyKHNlbGYuZXZlbnQudmFsdWUpCisgICAgICAgIGlmIHNlbGYuZXZlbnQuc3R5bGUgPT0gJyInIG9yIHNlbGYuY2Fub25pY2FsOgorICAgICAgICAgICAgcmV0dXJuICciJworICAgICAgICBpZiBub3Qgc2VsZi5ldmVudC5zdHlsZSBhbmQgc2VsZi5ldmVudC5pbXBsaWNpdFswXToKKyAgICAgICAgICAgIGlmIChub3QgKHNlbGYuc2ltcGxlX2tleV9jb250ZXh0IGFuZAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5hbmFseXNpcy5lbXB0eSBvciBzZWxmLmFuYWx5c2lzLm11bHRpbGluZSkpCisgICAgICAgICAgICAgICAgYW5kIChzZWxmLmZsb3dfbGV2ZWwgYW5kIHNlbGYuYW5hbHlzaXMuYWxsb3dfZmxvd19wbGFpbgorICAgICAgICAgICAgICAgICAgICBvciAobm90IHNlbGYuZmxvd19sZXZlbCBhbmQgc2VsZi5hbmFseXNpcy5hbGxvd19ibG9ja19wbGFpbikpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgaWYgc2VsZi5ldmVudC5zdHlsZSBhbmQgc2VsZi5ldmVudC5zdHlsZSBpbiAnfD4nOgorICAgICAgICAgICAgaWYgKG5vdCBzZWxmLmZsb3dfbGV2ZWwgYW5kIG5vdCBzZWxmLnNpbXBsZV9rZXlfY29udGV4dAorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5hbmFseXNpcy5hbGxvd19ibG9jayk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnQuc3R5bGUKKyAgICAgICAgaWYgbm90IHNlbGYuZXZlbnQuc3R5bGUgb3Igc2VsZi5ldmVudC5zdHlsZSA9PSAnXCcnOgorICAgICAgICAgICAgaWYgKHNlbGYuYW5hbHlzaXMuYWxsb3dfc2luZ2xlX3F1b3RlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IChzZWxmLnNpbXBsZV9rZXlfY29udGV4dCBhbmQgc2VsZi5hbmFseXNpcy5tdWx0aWxpbmUpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1wnJworICAgICAgICByZXR1cm4gJyInCisKKyAgICBkZWYgcHJvY2Vzc19zY2FsYXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYW5hbHlzaXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5hbHlzaXMgPSBzZWxmLmFuYWx5emVfc2NhbGFyKHNlbGYuZXZlbnQudmFsdWUpCisgICAgICAgIGlmIHNlbGYuc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3R5bGUgPSBzZWxmLmNob29zZV9zY2FsYXJfc3R5bGUoKQorICAgICAgICBzcGxpdCA9IChub3Qgc2VsZi5zaW1wbGVfa2V5X2NvbnRleHQpCisgICAgICAgICNpZiBzZWxmLmFuYWx5c2lzLm11bHRpbGluZSBhbmQgc3BsaXQgICAgXAorICAgICAgICAjICAgICAgICBhbmQgKG5vdCBzZWxmLnN0eWxlIG9yIHNlbGYuc3R5bGUgaW4gJ1wnXCInKToKKyAgICAgICAgIyAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgIGlmIHNlbGYuc3R5bGUgPT0gJyInOgorICAgICAgICAgICAgc2VsZi53cml0ZV9kb3VibGVfcXVvdGVkKHNlbGYuYW5hbHlzaXMuc2NhbGFyLCBzcGxpdCkKKyAgICAgICAgZWxpZiBzZWxmLnN0eWxlID09ICdcJyc6CisgICAgICAgICAgICBzZWxmLndyaXRlX3NpbmdsZV9xdW90ZWQoc2VsZi5hbmFseXNpcy5zY2FsYXIsIHNwbGl0KQorICAgICAgICBlbGlmIHNlbGYuc3R5bGUgPT0gJz4nOgorICAgICAgICAgICAgc2VsZi53cml0ZV9mb2xkZWQoc2VsZi5hbmFseXNpcy5zY2FsYXIpCisgICAgICAgIGVsaWYgc2VsZi5zdHlsZSA9PSAnfCc6CisgICAgICAgICAgICBzZWxmLndyaXRlX2xpdGVyYWwoc2VsZi5hbmFseXNpcy5zY2FsYXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlX3BsYWluKHNlbGYuYW5hbHlzaXMuc2NhbGFyLCBzcGxpdCkKKyAgICAgICAgc2VsZi5hbmFseXNpcyA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHlsZSA9IE5vbmUKKworICAgICMgQW5hbHl6ZXJzLgorCisgICAgZGVmIHByZXBhcmVfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgbWFqb3IsIG1pbm9yID0gdmVyc2lvbgorICAgICAgICBpZiBtYWpvciAhPSAxOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJ1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb246ICVkLiVkIiAlIChtYWpvciwgbWlub3IpKQorICAgICAgICByZXR1cm4gJyVkLiVkJyAlIChtYWpvciwgbWlub3IpCisKKyAgICBkZWYgcHJlcGFyZV90YWdfaGFuZGxlKHNlbGYsIGhhbmRsZSk6CisgICAgICAgIGlmIG5vdCBoYW5kbGU6CisgICAgICAgICAgICByYWlzZSBFbWl0dGVyRXJyb3IoInRhZyBoYW5kbGUgbXVzdCBub3QgYmUgZW1wdHkiKQorICAgICAgICBpZiBoYW5kbGVbMF0gIT0gJyEnIG9yIGhhbmRsZVstMV0gIT0gJyEnOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJ0YWcgaGFuZGxlIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoICchJzogJXIiICUgaGFuZGxlKQorICAgICAgICBmb3IgY2ggaW4gaGFuZGxlWzE6LTFdOgorICAgICAgICAgICAgaWYgbm90ICgnMCcgPD0gY2ggPD0gJzknIG9yICdBJyA8PSBjaCA8PSAnWicgb3IgJ2EnIDw9IGNoIDw9ICd6JyAgICBcCisgICAgICAgICAgICAgICAgICAgIG9yIGNoIGluICctXycpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIgJXIgaW4gdGhlIHRhZyBoYW5kbGU6ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2gsIGhhbmRsZSkpCisgICAgICAgIHJldHVybiBoYW5kbGUKKworICAgIGRlZiBwcmVwYXJlX3RhZ19wcmVmaXgoc2VsZiwgcHJlZml4KToKKyAgICAgICAgaWYgbm90IHByZWZpeDoKKyAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigidGFnIHByZWZpeCBtdXN0IG5vdCBiZSBlbXB0eSIpCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0ID0gZW5kID0gMAorICAgICAgICBpZiBwcmVmaXhbMF0gPT0gJyEnOgorICAgICAgICAgICAgZW5kID0gMQorICAgICAgICB3aGlsZSBlbmQgPCBsZW4ocHJlZml4KToKKyAgICAgICAgICAgIGNoID0gcHJlZml4W2VuZF0KKyAgICAgICAgICAgIGlmICcwJyA8PSBjaCA8PSAnOScgb3IgJ0EnIDw9IGNoIDw9ICdaJyBvciAnYScgPD0gY2ggPD0gJ3onIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gJy07Lz8hOkAmPSskLF8ufipcJygpW10nOgorICAgICAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHByZWZpeFtzdGFydDplbmRdKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kID0gZW5kKzEKKyAgICAgICAgICAgICAgICBkYXRhID0gY2guZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgICAgZm9yIGNoIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoJyUlJTAyWCcgJSBvcmQoY2gpKQorICAgICAgICBpZiBzdGFydCA8IGVuZDoKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQocHJlZml4W3N0YXJ0OmVuZF0pCisgICAgICAgIHJldHVybiAnJy5qb2luKGNodW5rcykKKworICAgIGRlZiBwcmVwYXJlX3RhZyhzZWxmLCB0YWcpOgorICAgICAgICBpZiBub3QgdGFnOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJ0YWcgbXVzdCBub3QgYmUgZW1wdHkiKQorICAgICAgICBpZiB0YWcgPT0gJyEnOgorICAgICAgICAgICAgcmV0dXJuIHRhZworICAgICAgICBoYW5kbGUgPSBOb25lCisgICAgICAgIHN1ZmZpeCA9IHRhZworICAgICAgICBwcmVmaXhlcyA9IHNvcnRlZChzZWxmLnRhZ19wcmVmaXhlcy5rZXlzKCkpCisgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CisgICAgICAgICAgICBpZiB0YWcuc3RhcnRzd2l0aChwcmVmaXgpICAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgKHByZWZpeCA9PSAnIScgb3IgbGVuKHByZWZpeCkgPCBsZW4odGFnKSk6CisgICAgICAgICAgICAgICAgaGFuZGxlID0gc2VsZi50YWdfcHJlZml4ZXNbcHJlZml4XQorICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHRhZ1tsZW4ocHJlZml4KTpdCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIHN0YXJ0ID0gZW5kID0gMAorICAgICAgICB3aGlsZSBlbmQgPCBsZW4oc3VmZml4KToKKyAgICAgICAgICAgIGNoID0gc3VmZml4W2VuZF0KKyAgICAgICAgICAgIGlmICcwJyA8PSBjaCA8PSAnOScgb3IgJ0EnIDw9IGNoIDw9ICdaJyBvciAnYScgPD0gY2ggPD0gJ3onIFwKKyAgICAgICAgICAgICAgICAgICAgb3IgY2ggaW4gJy07Lz86QCY9KyQsXy5+KlwnKClbXScgICBcCisgICAgICAgICAgICAgICAgICAgIG9yIChjaCA9PSAnIScgYW5kIGhhbmRsZSAhPSAnIScpOgorICAgICAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHN1ZmZpeFtzdGFydDplbmRdKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kID0gZW5kKzEKKyAgICAgICAgICAgICAgICBkYXRhID0gY2guZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgICAgZm9yIGNoIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoJyUlJTAyWCcgJSBvcmQoY2gpKQorICAgICAgICBpZiBzdGFydCA8IGVuZDoKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc3VmZml4W3N0YXJ0OmVuZF0pCisgICAgICAgIHN1ZmZpeF90ZXh0ID0gJycuam9pbihjaHVua3MpCisgICAgICAgIGlmIGhhbmRsZToKKyAgICAgICAgICAgIHJldHVybiAnJXMlcycgJSAoaGFuZGxlLCBzdWZmaXhfdGV4dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnITwlcz4nICUgc3VmZml4X3RleHQKKworICAgIGRlZiBwcmVwYXJlX2FuY2hvcihzZWxmLCBhbmNob3IpOgorICAgICAgICBpZiBub3QgYW5jaG9yOgorICAgICAgICAgICAgcmFpc2UgRW1pdHRlckVycm9yKCJhbmNob3IgbXVzdCBub3QgYmUgZW1wdHkiKQorICAgICAgICBmb3IgY2ggaW4gYW5jaG9yOgorICAgICAgICAgICAgaWYgbm90ICgnMCcgPD0gY2ggPD0gJzknIG9yICdBJyA8PSBjaCA8PSAnWicgb3IgJ2EnIDw9IGNoIDw9ICd6JyAgICBcCisgICAgICAgICAgICAgICAgICAgIG9yIGNoIGluICctXycpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVtaXR0ZXJFcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIgJXIgaW4gdGhlIGFuY2hvcjogJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIChjaCwgYW5jaG9yKSkKKyAgICAgICAgcmV0dXJuIGFuY2hvcgorCisgICAgZGVmIGFuYWx5emVfc2NhbGFyKHNlbGYsIHNjYWxhcik6CisKKyAgICAgICAgIyBFbXB0eSBzY2FsYXIgaXMgYSBzcGVjaWFsIGNhc2UuCisgICAgICAgIGlmIG5vdCBzY2FsYXI6CisgICAgICAgICAgICByZXR1cm4gU2NhbGFyQW5hbHlzaXMoc2NhbGFyPXNjYWxhciwgZW1wdHk9VHJ1ZSwgbXVsdGlsaW5lPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICBhbGxvd19mbG93X3BsYWluPUZhbHNlLCBhbGxvd19ibG9ja19wbGFpbj1UcnVlLAorICAgICAgICAgICAgICAgICAgICBhbGxvd19zaW5nbGVfcXVvdGVkPVRydWUsIGFsbG93X2RvdWJsZV9xdW90ZWQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfYmxvY2s9RmFsc2UpCisKKyAgICAgICAgIyBJbmRpY2F0b3JzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICAgICAgIGJsb2NrX2luZGljYXRvcnMgPSBGYWxzZQorICAgICAgICBmbG93X2luZGljYXRvcnMgPSBGYWxzZQorICAgICAgICBsaW5lX2JyZWFrcyA9IEZhbHNlCisgICAgICAgIHNwZWNpYWxfY2hhcmFjdGVycyA9IEZhbHNlCisKKyAgICAgICAgIyBJbXBvcnRhbnQgd2hpdGVzcGFjZSBjb21iaW5hdGlvbnMuCisgICAgICAgIGxlYWRpbmdfc3BhY2UgPSBGYWxzZQorICAgICAgICBsZWFkaW5nX2JyZWFrID0gRmFsc2UKKyAgICAgICAgdHJhaWxpbmdfc3BhY2UgPSBGYWxzZQorICAgICAgICB0cmFpbGluZ19icmVhayA9IEZhbHNlCisgICAgICAgIGJyZWFrX3NwYWNlID0gRmFsc2UKKyAgICAgICAgc3BhY2VfYnJlYWsgPSBGYWxzZQorCisgICAgICAgICMgQ2hlY2sgZG9jdW1lbnQgaW5kaWNhdG9ycy4KKyAgICAgICAgaWYgc2NhbGFyLnN0YXJ0c3dpdGgoJy0tLScpIG9yIHNjYWxhci5zdGFydHN3aXRoKCcuLi4nKToKKyAgICAgICAgICAgIGJsb2NrX2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisKKyAgICAgICAgIyBGaXJzdCBjaGFyYWN0ZXIgb3IgcHJlY2VkZWQgYnkgYSB3aGl0ZXNwYWNlLgorICAgICAgICBwcmVjZWVkZWRfYnlfd2hpdGVzcGFjZSA9IFRydWUKKworICAgICAgICAjIExhc3QgY2hhcmFjdGVyIG9yIGZvbGxvd2VkIGJ5IGEgd2hpdGVzcGFjZS4KKyAgICAgICAgZm9sbG93ZWRfYnlfd2hpdGVzcGFjZSA9IChsZW4oc2NhbGFyKSA9PSAxIG9yCisgICAgICAgICAgICAgICAgc2NhbGFyWzFdIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JykKKworICAgICAgICAjIFRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgYSBzcGFjZS4KKyAgICAgICAgcHJldmlvdXNfc3BhY2UgPSBGYWxzZQorCisgICAgICAgICMgVGhlIHByZXZpb3VzIGNoYXJhY3RlciBpcyBhIGJyZWFrLgorICAgICAgICBwcmV2aW91c19icmVhayA9IEZhbHNlCisKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIHdoaWxlIGluZGV4IDwgbGVuKHNjYWxhcik6CisgICAgICAgICAgICBjaCA9IHNjYWxhcltpbmRleF0KKworICAgICAgICAgICAgIyBDaGVjayBmb3IgaW5kaWNhdG9ycy4KKyAgICAgICAgICAgIGlmIGluZGV4ID09IDA6CisgICAgICAgICAgICAgICAgIyBMZWFkaW5nIGluZGljYXRvcnMgYXJlIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICBpZiBjaCBpbiAnIyxbXXt9JiohfD5cJ1wiJUBgJzogCisgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjaCBpbiAnPzonOgorICAgICAgICAgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGZvbGxvd2VkX2J5X3doaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGNoID09ICctJyBhbmQgZm9sbG93ZWRfYnlfd2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZmxvd19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBibG9ja19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFNvbWUgaW5kaWNhdG9ycyBjYW5ub3QgYXBwZWFyIHdpdGhpbiBhIHNjYWxhciBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIGlmIGNoIGluICcsP1tde30nOgorICAgICAgICAgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgY2ggPT0gJzonOgorICAgICAgICAgICAgICAgICAgICBmbG93X2luZGljYXRvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGZvbGxvd2VkX2J5X3doaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19pbmRpY2F0b3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGNoID09ICcjJyBhbmQgcHJlY2VlZGVkX2J5X3doaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5kaWNhdG9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfaW5kaWNhdG9ycyA9IFRydWUKKworICAgICAgICAgICAgIyBDaGVjayBmb3IgbGluZSBicmVha3MsIHNwZWNpYWwsIGFuZCB1bmljb2RlIGNoYXJhY3RlcnMuCisgICAgICAgICAgICBpZiBjaCBpbiAnXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBsaW5lX2JyZWFrcyA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCAoY2ggPT0gJ1xuJyBvciAnXHgyMCcgPD0gY2ggPD0gJ1x4N0UnKToKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1x4ODUnIG9yICdceEEwJyA8PSBjaCA8PSAnXHVEN0ZGJworICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ1x1RTAwMCcgPD0gY2ggPD0gJ1x1RkZGRCcpIGFuZCBjaCAhPSAnXHVGRUZGJzoKKyAgICAgICAgICAgICAgICAgICAgdW5pY29kZV9jaGFyYWN0ZXJzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd191bmljb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbF9jaGFyYWN0ZXJzID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfY2hhcmFjdGVycyA9IFRydWUKKworICAgICAgICAgICAgIyBEZXRlY3QgaW1wb3J0YW50IHdoaXRlc3BhY2UgY29tYmluYXRpb25zLgorICAgICAgICAgICAgaWYgY2ggPT0gJyAnOgorICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IDA6CisgICAgICAgICAgICAgICAgICAgIGxlYWRpbmdfc3BhY2UgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgaW5kZXggPT0gbGVuKHNjYWxhciktMToKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfc3BhY2UgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgcHJldmlvdXNfYnJlYWs6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrX3NwYWNlID0gVHJ1ZQorICAgICAgICAgICAgICAgIHByZXZpb3VzX3NwYWNlID0gVHJ1ZQorICAgICAgICAgICAgICAgIHByZXZpb3VzX2JyZWFrID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgY2ggaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgaWYgaW5kZXggPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbGVhZGluZ19icmVhayA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBpbmRleCA9PSBsZW4oc2NhbGFyKS0xOgorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19icmVhayA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBwcmV2aW91c19zcGFjZToKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VfYnJlYWsgPSBUcnVlCisgICAgICAgICAgICAgICAgcHJldmlvdXNfc3BhY2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIHByZXZpb3VzX2JyZWFrID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmV2aW91c19zcGFjZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJldmlvdXNfYnJlYWsgPSBGYWxzZQorCisgICAgICAgICAgICAjIFByZXBhcmUgZm9yIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHByZWNlZWRlZF9ieV93aGl0ZXNwYWNlID0gKGNoIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JykKKyAgICAgICAgICAgIGZvbGxvd2VkX2J5X3doaXRlc3BhY2UgPSAoaW5kZXgrMSA+PSBsZW4oc2NhbGFyKSBvcgorICAgICAgICAgICAgICAgICAgICBzY2FsYXJbaW5kZXgrMV0gaW4gJ1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknKQorCisgICAgICAgICMgTGV0J3MgZGVjaWRlIHdoYXQgc3R5bGVzIGFyZSBhbGxvd2VkLgorICAgICAgICBhbGxvd19mbG93X3BsYWluID0gVHJ1ZQorICAgICAgICBhbGxvd19ibG9ja19wbGFpbiA9IFRydWUKKyAgICAgICAgYWxsb3dfc2luZ2xlX3F1b3RlZCA9IFRydWUKKyAgICAgICAgYWxsb3dfZG91YmxlX3F1b3RlZCA9IFRydWUKKyAgICAgICAgYWxsb3dfYmxvY2sgPSBUcnVlCisKKyAgICAgICAgIyBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhcmUgYmFkIGZvciBwbGFpbiBzY2FsYXJzLgorICAgICAgICBpZiAobGVhZGluZ19zcGFjZSBvciBsZWFkaW5nX2JyZWFrCisgICAgICAgICAgICAgICAgb3IgdHJhaWxpbmdfc3BhY2Ugb3IgdHJhaWxpbmdfYnJlYWspOgorICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbiA9IGFsbG93X2Jsb2NrX3BsYWluID0gRmFsc2UKKworICAgICAgICAjIFdlIGRvIG5vdCBwZXJtaXQgdHJhaWxpbmcgc3BhY2VzIGZvciBibG9jayBzY2FsYXJzLgorICAgICAgICBpZiB0cmFpbGluZ19zcGFjZToKKyAgICAgICAgICAgIGFsbG93X2Jsb2NrID0gRmFsc2UKKworICAgICAgICAjIFNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IGxpbmUgYXJlIG9ubHkgYWNjZXB0YWJsZSBmb3IgYmxvY2sKKyAgICAgICAgIyBzY2FsYXJzLgorICAgICAgICBpZiBicmVha19zcGFjZToKKyAgICAgICAgICAgIGFsbG93X2Zsb3dfcGxhaW4gPSBhbGxvd19ibG9ja19wbGFpbiA9IGFsbG93X3NpbmdsZV9xdW90ZWQgPSBGYWxzZQorCisgICAgICAgICMgU3BhY2VzIGZvbGxvd2VkIGJ5IGJyZWFrcywgYXMgd2VsbCBhcyBzcGVjaWFsIGNoYXJhY3RlciBhcmUgb25seQorICAgICAgICAjIGFsbG93ZWQgZm9yIGRvdWJsZSBxdW90ZWQgc2NhbGFycy4KKyAgICAgICAgaWYgc3BhY2VfYnJlYWsgb3Igc3BlY2lhbF9jaGFyYWN0ZXJzOgorICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbiA9IGFsbG93X2Jsb2NrX3BsYWluID0gIFwKKyAgICAgICAgICAgIGFsbG93X3NpbmdsZV9xdW90ZWQgPSBhbGxvd19ibG9jayA9IEZhbHNlCisKKyAgICAgICAgIyBBbHRob3VnaCB0aGUgcGxhaW4gc2NhbGFyIHdyaXRlciBzdXBwb3J0cyBicmVha3MsIHdlIG5ldmVyIGVtaXQKKyAgICAgICAgIyBtdWx0aWxpbmUgcGxhaW4gc2NhbGFycy4KKyAgICAgICAgaWYgbGluZV9icmVha3M6CisgICAgICAgICAgICBhbGxvd19mbG93X3BsYWluID0gYWxsb3dfYmxvY2tfcGxhaW4gPSBGYWxzZQorCisgICAgICAgICMgRmxvdyBpbmRpY2F0b3JzIGFyZSBmb3JiaWRkZW4gZm9yIGZsb3cgcGxhaW4gc2NhbGFycy4KKyAgICAgICAgaWYgZmxvd19pbmRpY2F0b3JzOgorICAgICAgICAgICAgYWxsb3dfZmxvd19wbGFpbiA9IEZhbHNlCisKKyAgICAgICAgIyBCbG9jayBpbmRpY2F0b3JzIGFyZSBmb3JiaWRkZW4gZm9yIGJsb2NrIHBsYWluIHNjYWxhcnMuCisgICAgICAgIGlmIGJsb2NrX2luZGljYXRvcnM6CisgICAgICAgICAgICBhbGxvd19ibG9ja19wbGFpbiA9IEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFNjYWxhckFuYWx5c2lzKHNjYWxhcj1zY2FsYXIsCisgICAgICAgICAgICAgICAgZW1wdHk9RmFsc2UsIG11bHRpbGluZT1saW5lX2JyZWFrcywKKyAgICAgICAgICAgICAgICBhbGxvd19mbG93X3BsYWluPWFsbG93X2Zsb3dfcGxhaW4sCisgICAgICAgICAgICAgICAgYWxsb3dfYmxvY2tfcGxhaW49YWxsb3dfYmxvY2tfcGxhaW4sCisgICAgICAgICAgICAgICAgYWxsb3dfc2luZ2xlX3F1b3RlZD1hbGxvd19zaW5nbGVfcXVvdGVkLAorICAgICAgICAgICAgICAgIGFsbG93X2RvdWJsZV9xdW90ZWQ9YWxsb3dfZG91YmxlX3F1b3RlZCwKKyAgICAgICAgICAgICAgICBhbGxvd19ibG9jaz1hbGxvd19ibG9jaykKKworICAgICMgV3JpdGVycy4KKworICAgIGRlZiBmbHVzaF9zdHJlYW0oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5zdHJlYW0sICdmbHVzaCcpOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIHdyaXRlX3N0cmVhbV9zdGFydChzZWxmKToKKyAgICAgICAgIyBXcml0ZSBCT00gaWYgbmVlZGVkLgorICAgICAgICBpZiBzZWxmLmVuY29kaW5nIGFuZCBzZWxmLmVuY29kaW5nLnN0YXJ0c3dpdGgoJ3V0Zi0xNicpOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoJ1x1RkVGRicuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQorCisgICAgZGVmIHdyaXRlX3N0cmVhbV9lbmQoc2VsZik6CisgICAgICAgIHNlbGYuZmx1c2hfc3RyZWFtKCkKKworICAgIGRlZiB3cml0ZV9pbmRpY2F0b3Ioc2VsZiwgaW5kaWNhdG9yLCBuZWVkX3doaXRlc3BhY2UsCisgICAgICAgICAgICB3aGl0ZXNwYWNlPUZhbHNlLCBpbmRlbnRpb249RmFsc2UpOgorICAgICAgICBpZiBzZWxmLndoaXRlc3BhY2Ugb3Igbm90IG5lZWRfd2hpdGVzcGFjZToKKyAgICAgICAgICAgIGRhdGEgPSBpbmRpY2F0b3IKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSAnICcraW5kaWNhdG9yCisgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IHdoaXRlc3BhY2UKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBzZWxmLmluZGVudGlvbiBhbmQgaW5kZW50aW9uCisgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICBzZWxmLm9wZW5fZW5kZWQgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICBkZWYgd3JpdGVfaW5kZW50KHNlbGYpOgorICAgICAgICBpbmRlbnQgPSBzZWxmLmluZGVudCBvciAwCisgICAgICAgIGlmIG5vdCBzZWxmLmluZGVudGlvbiBvciBzZWxmLmNvbHVtbiA+IGluZGVudCAgIFwKKyAgICAgICAgICAgICAgICBvciAoc2VsZi5jb2x1bW4gPT0gaW5kZW50IGFuZCBub3Qgc2VsZi53aGl0ZXNwYWNlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgIGlmIHNlbGYuY29sdW1uIDwgaW5kZW50OgorICAgICAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gVHJ1ZQorICAgICAgICAgICAgZGF0YSA9ICcgJyooaW5kZW50LXNlbGYuY29sdW1uKQorICAgICAgICAgICAgc2VsZi5jb2x1bW4gPSBpbmRlbnQKKyAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorCisgICAgZGVmIHdyaXRlX2xpbmVfYnJlYWsoc2VsZiwgZGF0YT1Ob25lKToKKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuYmVzdF9saW5lX2JyZWFrCisgICAgICAgIHNlbGYud2hpdGVzcGFjZSA9IFRydWUKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBUcnVlCisgICAgICAgIHNlbGYubGluZSArPSAxCisgICAgICAgIHNlbGYuY29sdW1uID0gMAorICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICBkZWYgd3JpdGVfdmVyc2lvbl9kaXJlY3RpdmUoc2VsZiwgdmVyc2lvbl90ZXh0KToKKyAgICAgICAgZGF0YSA9ICclJVlBTUwgJXMnICUgdmVyc2lvbl90ZXh0CisgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKworICAgIGRlZiB3cml0ZV90YWdfZGlyZWN0aXZlKHNlbGYsIGhhbmRsZV90ZXh0LCBwcmVmaXhfdGV4dCk6CisgICAgICAgIGRhdGEgPSAnJSVUQUcgJXMgJXMnICUgKGhhbmRsZV90ZXh0LCBwcmVmaXhfdGV4dCkKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorCisgICAgIyBTY2FsYXIgc3RyZWFtcy4KKworICAgIGRlZiB3cml0ZV9zaW5nbGVfcXVvdGVkKHNlbGYsIHRleHQsIHNwbGl0PVRydWUpOgorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignXCcnLCBUcnVlKQorICAgICAgICBzcGFjZXMgPSBGYWxzZQorICAgICAgICBicmVha3MgPSBGYWxzZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCAhPSAnICc6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0KzEgPT0gZW5kIGFuZCBzZWxmLmNvbHVtbiA+IHNlbGYuYmVzdF93aWR0aCBhbmQgc3BsaXQgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0YXJ0ICE9IDAgYW5kIGVuZCAhPSBsZW4odGV4dCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgZWxpZiBicmVha3M6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBub3QgaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHRleHRbc3RhcnRdID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBmb3IgYnIgaW4gdGV4dFtzdGFydDplbmRdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnIgPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoYnIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBpbiAnIFxuXHg4NVx1MjAyOFx1MjAyOScgb3IgY2ggPT0gJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQgPCBlbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGlmIGNoID09ICdcJyc6CisgICAgICAgICAgICAgICAgZGF0YSA9ICdcJ1wnJworICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IDIKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMQorICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3BhY2VzID0gKGNoID09ICcgJykKKyAgICAgICAgICAgICAgICBicmVha3MgPSAoY2ggaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOScpCisgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignXCcnLCBGYWxzZSkKKworICAgIEVTQ0FQRV9SRVBMQUNFTUVOVFMgPSB7CisgICAgICAgICdcMCc6ICAgICAgICcwJywKKyAgICAgICAgJ1x4MDcnOiAgICAgJ2EnLAorICAgICAgICAnXHgwOCc6ICAgICAnYicsCisgICAgICAgICdceDA5JzogICAgICd0JywKKyAgICAgICAgJ1x4MEEnOiAgICAgJ24nLAorICAgICAgICAnXHgwQic6ICAgICAndicsCisgICAgICAgICdceDBDJzogICAgICdmJywKKyAgICAgICAgJ1x4MEQnOiAgICAgJ3InLAorICAgICAgICAnXHgxQic6ICAgICAnZScsCisgICAgICAgICdcIic6ICAgICAgICdcIicsCisgICAgICAgICdcXCc6ICAgICAgICdcXCcsCisgICAgICAgICdceDg1JzogICAgICdOJywKKyAgICAgICAgJ1x4QTAnOiAgICAgJ18nLAorICAgICAgICAnXHUyMDI4JzogICAnTCcsCisgICAgICAgICdcdTIwMjknOiAgICdQJywKKyAgICB9CisKKyAgICBkZWYgd3JpdGVfZG91YmxlX3F1b3RlZChzZWxmLCB0ZXh0LCBzcGxpdD1UcnVlKToKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJyInLCBUcnVlKQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBjaCBpcyBOb25lIG9yIGNoIGluICciXFxceDg1XHUyMDI4XHUyMDI5XHVGRUZGJyBcCisgICAgICAgICAgICAgICAgICAgIG9yIG5vdCAoJ1x4MjAnIDw9IGNoIDw9ICdceDdFJworICAgICAgICAgICAgICAgICAgICAgICAgb3IgKHNlbGYuYWxsb3dfdW5pY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAoJ1x4QTAnIDw9IGNoIDw9ICdcdUQ3RkYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICdcdUUwMDAnIDw9IGNoIDw9ICdcdUZGRkQnKSkpOgorICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDwgZW5kOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoIGluIHNlbGYuRVNDQVBFX1JFUExBQ0VNRU5UUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnXFwnK3NlbGYuRVNDQVBFX1JFUExBQ0VNRU5UU1tjaF0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjaCA8PSAnXHhGRic6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gJ1xceCUwMlgnICUgb3JkKGNoKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGNoIDw9ICdcdUZGRkYnOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdcXHUlMDRYJyAlIG9yZChjaCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnXFxVJTA4WCcgJSBvcmQoY2gpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kKzEKKyAgICAgICAgICAgIGlmIDAgPCBlbmQgPCBsZW4odGV4dCktMSBhbmQgKGNoID09ICcgJyBvciBzdGFydCA+PSBlbmQpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYuY29sdW1uKyhlbmQtc3RhcnQpID4gc2VsZi5iZXN0X3dpZHRoIGFuZCBzcGxpdDoKKyAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdKydcXCcKKyAgICAgICAgICAgICAgICBpZiBzdGFydCA8IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50aW9uID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiB0ZXh0W3N0YXJ0XSA9PSAnICc6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnXFwnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICBzZWxmLndyaXRlX2luZGljYXRvcignIicsIEZhbHNlKQorCisgICAgZGVmIGRldGVybWluZV9ibG9ja19oaW50cyhzZWxmLCB0ZXh0KToKKyAgICAgICAgaGludHMgPSAnJworICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgaWYgdGV4dFswXSBpbiAnIFxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgaGludHMgKz0gc3RyKHNlbGYuYmVzdF9pbmRlbnQpCisgICAgICAgICAgICBpZiB0ZXh0Wy0xXSBub3QgaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgaGludHMgKz0gJy0nCisgICAgICAgICAgICBlbGlmIGxlbih0ZXh0KSA9PSAxIG9yIHRleHRbLTJdIGluICdcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGhpbnRzICs9ICcrJworICAgICAgICByZXR1cm4gaGludHMKKworICAgIGRlZiB3cml0ZV9mb2xkZWQoc2VsZiwgdGV4dCk6CisgICAgICAgIGhpbnRzID0gc2VsZi5kZXRlcm1pbmVfYmxvY2tfaGludHModGV4dCkKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJz4nK2hpbnRzLCBUcnVlKQorICAgICAgICBpZiBoaW50c1stMTpdID09ICcrJzoKKyAgICAgICAgICAgIHNlbGYub3Blbl9lbmRlZCA9IFRydWUKKyAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgbGVhZGluZ19zcGFjZSA9IFRydWUKKyAgICAgICAgc3BhY2VzID0gRmFsc2UKKyAgICAgICAgYnJlYWtzID0gVHJ1ZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBicmVha3M6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBub3QgaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsZWFkaW5nX3NwYWNlIGFuZCBjaCBpcyBub3QgTm9uZSBhbmQgY2ggIT0gJyAnICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0ZXh0W3N0YXJ0XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgbGVhZGluZ19zcGFjZSA9IChjaCA9PSAnICcpCisgICAgICAgICAgICAgICAgICAgIGZvciBiciBpbiB0ZXh0W3N0YXJ0OmVuZF06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiciA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhayhicikKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbGlmIHNwYWNlczoKKyAgICAgICAgICAgICAgICBpZiBjaCAhPSAnICc6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0KzEgPT0gZW5kIGFuZCBzZWxmLmNvbHVtbiA+IHNlbGYuYmVzdF93aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmUgb3IgY2ggaW4gJyBcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGV4dFtzdGFydDplbmRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWtzID0gKGNoIGluICdcblx4ODVcdTIwMjhcdTIwMjknKQorICAgICAgICAgICAgICAgIHNwYWNlcyA9IChjaCA9PSAnICcpCisgICAgICAgICAgICBlbmQgKz0gMQorCisgICAgZGVmIHdyaXRlX2xpdGVyYWwoc2VsZiwgdGV4dCk6CisgICAgICAgIGhpbnRzID0gc2VsZi5kZXRlcm1pbmVfYmxvY2tfaGludHModGV4dCkKKyAgICAgICAgc2VsZi53cml0ZV9pbmRpY2F0b3IoJ3wnK2hpbnRzLCBUcnVlKQorICAgICAgICBpZiBoaW50c1stMTpdID09ICcrJzoKKyAgICAgICAgICAgIHNlbGYub3Blbl9lbmRlZCA9IFRydWUKKyAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgYnJlYWtzID0gVHJ1ZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBicmVha3M6CisgICAgICAgICAgICAgICAgaWYgY2ggaXMgTm9uZSBvciBjaCBub3QgaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGZvciBiciBpbiB0ZXh0W3N0YXJ0OmVuZF06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiciA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhaygpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZV9icmVhayhicikKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGNoIGlzIE5vbmUgb3IgY2ggaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiBjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGlmIGNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrcyA9IChjaCBpbiAnXG5ceDg1XHUyMDI4XHUyMDI5JykKKyAgICAgICAgICAgIGVuZCArPSAxCisKKyAgICBkZWYgd3JpdGVfcGxhaW4oc2VsZiwgdGV4dCwgc3BsaXQ9VHJ1ZSk6CisgICAgICAgIGlmIHNlbGYucm9vdF9jb250ZXh0OgorICAgICAgICAgICAgc2VsZi5vcGVuX2VuZGVkID0gVHJ1ZQorICAgICAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi53aGl0ZXNwYWNlOgorICAgICAgICAgICAgZGF0YSA9ICcgJworICAgICAgICAgICAgc2VsZi5jb2x1bW4gKz0gbGVuKGRhdGEpCisgICAgICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBGYWxzZQorICAgICAgICBzcGFjZXMgPSBGYWxzZQorICAgICAgICBicmVha3MgPSBGYWxzZQorICAgICAgICBzdGFydCA9IGVuZCA9IDAKKyAgICAgICAgd2hpbGUgZW5kIDw9IGxlbih0ZXh0KToKKyAgICAgICAgICAgIGNoID0gTm9uZQorICAgICAgICAgICAgaWYgZW5kIDwgbGVuKHRleHQpOgorICAgICAgICAgICAgICAgIGNoID0gdGV4dFtlbmRdCisgICAgICAgICAgICBpZiBzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgY2ggIT0gJyAnOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGFydCsxID09IGVuZCBhbmQgc2VsZi5jb2x1bW4gPiBzZWxmLmJlc3Rfd2lkdGggYW5kIHNwbGl0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50aW9uID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0ZXh0W3N0YXJ0OmVuZF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbGlmIGJyZWFrczoKKyAgICAgICAgICAgICAgICBpZiBjaCBub3QgaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHRleHRbc3RhcnRdID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICBmb3IgYnIgaW4gdGV4dFtzdGFydDplbmRdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnIgPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2xpbmVfYnJlYWsoYnIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRlbnRpb24gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBjaCBpcyBOb25lIG9yIGNoIGluICcgXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRleHRbc3RhcnQ6ZW5kXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbHVtbiArPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgICAgaWYgY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3BhY2VzID0gKGNoID09ICcgJykKKyAgICAgICAgICAgICAgICBicmVha3MgPSAoY2ggaW4gJ1xuXHg4NVx1MjAyOFx1MjAyOScpCisgICAgICAgICAgICBlbmQgKz0gMQorCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvZXJyb3IucHkgYi9saWIzL3lhbWwvZXJyb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5NmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYjMveWFtbC9lcnJvci5weQpAQCAtMCwwICsxLDc1IEBACisKK19fYWxsX18gPSBbJ01hcmsnLCAnWUFNTEVycm9yJywgJ01hcmtlZFlBTUxFcnJvciddCisKK2NsYXNzIE1hcms6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaW5kZXgsIGxpbmUsIGNvbHVtbiwgYnVmZmVyLCBwb2ludGVyKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorICAgICAgICBzZWxmLmNvbHVtbiA9IGNvbHVtbgorICAgICAgICBzZWxmLmJ1ZmZlciA9IGJ1ZmZlcgorICAgICAgICBzZWxmLnBvaW50ZXIgPSBwb2ludGVyCisKKyAgICBkZWYgZ2V0X3NuaXBwZXQoc2VsZiwgaW5kZW50PTQsIG1heF9sZW5ndGg9NzUpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaGVhZCA9ICcnCisgICAgICAgIHN0YXJ0ID0gc2VsZi5wb2ludGVyCisgICAgICAgIHdoaWxlIHN0YXJ0ID4gMCBhbmQgc2VsZi5idWZmZXJbc3RhcnQtMV0gbm90IGluICdcMFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIHN0YXJ0IC09IDEKKyAgICAgICAgICAgIGlmIHNlbGYucG9pbnRlci1zdGFydCA+IG1heF9sZW5ndGgvMi0xOgorICAgICAgICAgICAgICAgIGhlYWQgPSAnIC4uLiAnCisgICAgICAgICAgICAgICAgc3RhcnQgKz0gNQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHRhaWwgPSAnJworICAgICAgICBlbmQgPSBzZWxmLnBvaW50ZXIKKyAgICAgICAgd2hpbGUgZW5kIDwgbGVuKHNlbGYuYnVmZmVyKSBhbmQgc2VsZi5idWZmZXJbZW5kXSBub3QgaW4gJ1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgZW5kICs9IDEKKyAgICAgICAgICAgIGlmIGVuZC1zZWxmLnBvaW50ZXIgPiBtYXhfbGVuZ3RoLzItMToKKyAgICAgICAgICAgICAgICB0YWlsID0gJyAuLi4gJworICAgICAgICAgICAgICAgIGVuZCAtPSA1CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc25pcHBldCA9IHNlbGYuYnVmZmVyW3N0YXJ0OmVuZF0KKyAgICAgICAgcmV0dXJuICcgJyppbmRlbnQgKyBoZWFkICsgc25pcHBldCArIHRhaWwgKyAnXG4nICBcCisgICAgICAgICAgICAgICAgKyAnICcqKGluZGVudCtzZWxmLnBvaW50ZXItc3RhcnQrbGVuKGhlYWQpKSArICdeJworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHNuaXBwZXQgPSBzZWxmLmdldF9zbmlwcGV0KCkKKyAgICAgICAgd2hlcmUgPSAiICBpbiBcIiVzXCIsIGxpbmUgJWQsIGNvbHVtbiAlZCIgICBcCisgICAgICAgICAgICAgICAgJSAoc2VsZi5uYW1lLCBzZWxmLmxpbmUrMSwgc2VsZi5jb2x1bW4rMSkKKyAgICAgICAgaWYgc25pcHBldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdoZXJlICs9ICI6XG4iK3NuaXBwZXQKKyAgICAgICAgcmV0dXJuIHdoZXJlCisKK2NsYXNzIFlBTUxFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgTWFya2VkWUFNTEVycm9yKFlBTUxFcnJvcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGV4dD1Ob25lLCBjb250ZXh0X21hcms9Tm9uZSwKKyAgICAgICAgICAgIHByb2JsZW09Tm9uZSwgcHJvYmxlbV9tYXJrPU5vbmUsIG5vdGU9Tm9uZSk6CisgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKKyAgICAgICAgc2VsZi5jb250ZXh0X21hcmsgPSBjb250ZXh0X21hcmsKKyAgICAgICAgc2VsZi5wcm9ibGVtID0gcHJvYmxlbQorICAgICAgICBzZWxmLnByb2JsZW1fbWFyayA9IHByb2JsZW1fbWFyaworICAgICAgICBzZWxmLm5vdGUgPSBub3RlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBpZiBzZWxmLmNvbnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc2VsZi5jb250ZXh0KQorICAgICAgICBpZiBzZWxmLmNvbnRleHRfbWFyayBpcyBub3QgTm9uZSAgXAorICAgICAgICAgICAgYW5kIChzZWxmLnByb2JsZW0gaXMgTm9uZSBvciBzZWxmLnByb2JsZW1fbWFyayBpcyBOb25lCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuY29udGV4dF9tYXJrLm5hbWUgIT0gc2VsZi5wcm9ibGVtX21hcmsubmFtZQorICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmNvbnRleHRfbWFyay5saW5lICE9IHNlbGYucHJvYmxlbV9tYXJrLmxpbmUKKyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5jb250ZXh0X21hcmsuY29sdW1uICE9IHNlbGYucHJvYmxlbV9tYXJrLmNvbHVtbik6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3RyKHNlbGYuY29udGV4dF9tYXJrKSkKKyAgICAgICAgaWYgc2VsZi5wcm9ibGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYucHJvYmxlbSkKKyAgICAgICAgaWYgc2VsZi5wcm9ibGVtX21hcmsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3RyKHNlbGYucHJvYmxlbV9tYXJrKSkKKyAgICAgICAgaWYgc2VsZi5ub3RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHNlbGYubm90ZSkKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKKwpkaWZmIC0tZ2l0IGEvbGliMy95YW1sL2V2ZW50cy5weSBiL2xpYjMveWFtbC9ldmVudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5YWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYjMveWFtbC9ldmVudHMucHkKQEAgLTAsMCArMSw4NiBAQAorCisjIEFic3RyYWN0IGNsYXNzZXMuCisKK2NsYXNzIEV2ZW50KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSk6CisgICAgICAgIHNlbGYuc3RhcnRfbWFyayA9IHN0YXJ0X21hcmsKKyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhdHRyaWJ1dGVzID0gW2tleSBmb3Iga2V5IGluIFsnYW5jaG9yJywgJ3RhZycsICdpbXBsaWNpdCcsICd2YWx1ZSddCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBrZXkpXQorICAgICAgICBhcmd1bWVudHMgPSAnLCAnLmpvaW4oWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBhdHRyaWJ1dGVzXSkKKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBhcmd1bWVudHMpCisKK2NsYXNzIE5vZGVFdmVudChFdmVudCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFuY2hvciwgc3RhcnRfbWFyaz1Ob25lLCBlbmRfbWFyaz1Ob25lKToKKyAgICAgICAgc2VsZi5hbmNob3IgPSBhbmNob3IKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgQ29sbGVjdGlvblN0YXJ0RXZlbnQoTm9kZUV2ZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYW5jaG9yLCB0YWcsIGltcGxpY2l0LCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsCisgICAgICAgICAgICBmbG93X3N0eWxlPU5vbmUpOgorICAgICAgICBzZWxmLmFuY2hvciA9IGFuY2hvcgorICAgICAgICBzZWxmLnRhZyA9IHRhZworICAgICAgICBzZWxmLmltcGxpY2l0ID0gaW1wbGljaXQKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICAgICAgc2VsZi5mbG93X3N0eWxlID0gZmxvd19zdHlsZQorCitjbGFzcyBDb2xsZWN0aW9uRW5kRXZlbnQoRXZlbnQpOgorICAgIHBhc3MKKworIyBJbXBsZW1lbnRhdGlvbnMuCisKK2NsYXNzIFN0cmVhbVN0YXJ0RXZlbnQoRXZlbnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworY2xhc3MgU3RyZWFtRW5kRXZlbnQoRXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgRG9jdW1lbnRTdGFydEV2ZW50KEV2ZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnRfbWFyaz1Ob25lLCBlbmRfbWFyaz1Ob25lLAorICAgICAgICAgICAgZXhwbGljaXQ9Tm9uZSwgdmVyc2lvbj1Ob25lLCB0YWdzPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmV4cGxpY2l0ID0gZXhwbGljaXQKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLnRhZ3MgPSB0YWdzCisKK2NsYXNzIERvY3VtZW50RW5kRXZlbnQoRXZlbnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsCisgICAgICAgICAgICBleHBsaWNpdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICAgICAgc2VsZi5leHBsaWNpdCA9IGV4cGxpY2l0CisKK2NsYXNzIEFsaWFzRXZlbnQoTm9kZUV2ZW50KToKKyAgICBwYXNzCisKK2NsYXNzIFNjYWxhckV2ZW50KE5vZGVFdmVudCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFuY2hvciwgdGFnLCBpbXBsaWNpdCwgdmFsdWUsCisgICAgICAgICAgICBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIHN0eWxlPU5vbmUpOgorICAgICAgICBzZWxmLmFuY2hvciA9IGFuY2hvcgorICAgICAgICBzZWxmLnRhZyA9IHRhZworICAgICAgICBzZWxmLmltcGxpY2l0ID0gaW1wbGljaXQKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuc3RhcnRfbWFyayA9IHN0YXJ0X21hcmsKKyAgICAgICAgc2VsZi5lbmRfbWFyayA9IGVuZF9tYXJrCisgICAgICAgIHNlbGYuc3R5bGUgPSBzdHlsZQorCitjbGFzcyBTZXF1ZW5jZVN0YXJ0RXZlbnQoQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgU2VxdWVuY2VFbmRFdmVudChDb2xsZWN0aW9uRW5kRXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgTWFwcGluZ1N0YXJ0RXZlbnQoQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgIHBhc3MKKworY2xhc3MgTWFwcGluZ0VuZEV2ZW50KENvbGxlY3Rpb25FbmRFdmVudCk6CisgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvbG9hZGVyLnB5IGIvbGliMy95YW1sL2xvYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGM4ZjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL2xvYWRlci5weQpAQCAtMCwwICsxLDQwIEBACisKK19fYWxsX18gPSBbJ0Jhc2VMb2FkZXInLCAnU2FmZUxvYWRlcicsICdMb2FkZXInXQorCitmcm9tIC5yZWFkZXIgaW1wb3J0ICoKK2Zyb20gLnNjYW5uZXIgaW1wb3J0ICoKK2Zyb20gLnBhcnNlciBpbXBvcnQgKgorZnJvbSAuY29tcG9zZXIgaW1wb3J0ICoKK2Zyb20gLmNvbnN0cnVjdG9yIGltcG9ydCAqCitmcm9tIC5yZXNvbHZlciBpbXBvcnQgKgorCitjbGFzcyBCYXNlTG9hZGVyKFJlYWRlciwgU2Nhbm5lciwgUGFyc2VyLCBDb21wb3NlciwgQmFzZUNvbnN0cnVjdG9yLCBCYXNlUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIEJhc2VDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBCYXNlUmVzb2x2ZXIuX19pbml0X18oc2VsZikKKworY2xhc3MgU2FmZUxvYWRlcihSZWFkZXIsIFNjYW5uZXIsIFBhcnNlciwgQ29tcG9zZXIsIFNhZmVDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIFNhZmVDb25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBSZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBMb2FkZXIoUmVhZGVyLCBTY2FubmVyLCBQYXJzZXIsIENvbXBvc2VyLCBDb25zdHJ1Y3RvciwgUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIFJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIENvbnN0cnVjdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIFJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKZGlmZiAtLWdpdCBhL2xpYjMveWFtbC9ub2Rlcy5weSBiL2xpYjMveWFtbC9ub2Rlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGYwNzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL25vZGVzLnB5CkBAIC0wLDAgKzEsNDkgQEAKKworY2xhc3MgTm9kZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWcsIHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyayk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgICNpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgIyAgICBpZiBsZW4odmFsdWUpID09IDA6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzxlbXB0eT4nCisgICAgICAgICMgICAgZWxpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzwxIGl0ZW0+JworICAgICAgICAjICAgIGVsc2U6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gJzwlZCBpdGVtcz4nICUgbGVuKHZhbHVlKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBpZiBsZW4odmFsdWUpID4gNzU6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gcmVwcih2YWx1ZVs6NzBdK3UnIC4uLiAnKQorICAgICAgICAjICAgIGVsc2U6CisgICAgICAgICMgICAgICAgIHZhbHVlID0gcmVwcih2YWx1ZSkKKyAgICAgICAgdmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICByZXR1cm4gJyVzKHRhZz0lciwgdmFsdWU9JXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi50YWcsIHZhbHVlKQorCitjbGFzcyBTY2FsYXJOb2RlKE5vZGUpOgorICAgIGlkID0gJ3NjYWxhcicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnLCB2YWx1ZSwKKyAgICAgICAgICAgIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSwgc3R5bGU9Tm9uZSk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKKworY2xhc3MgQ29sbGVjdGlvbk5vZGUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhZywgdmFsdWUsCisgICAgICAgICAgICBzdGFydF9tYXJrPU5vbmUsIGVuZF9tYXJrPU5vbmUsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmZsb3dfc3R5bGUgPSBmbG93X3N0eWxlCisKK2NsYXNzIFNlcXVlbmNlTm9kZShDb2xsZWN0aW9uTm9kZSk6CisgICAgaWQgPSAnc2VxdWVuY2UnCisKK2NsYXNzIE1hcHBpbmdOb2RlKENvbGxlY3Rpb25Ob2RlKToKKyAgICBpZCA9ICdtYXBwaW5nJworCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvcGFyc2VyLnB5IGIvbGliMy95YW1sL3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL3BhcnNlci5weQpAQCAtMCwwICsxLDU4OSBAQAorCisjIFRoZSBmb2xsb3dpbmcgWUFNTCBncmFtbWFyIGlzIExMKDEpIGFuZCBpcyBwYXJzZWQgYnkgYSByZWN1cnNpdmUgZGVzY2VudAorIyBwYXJzZXIuCisjCisjIHN0cmVhbSAgICAgICAgICAgIDo6PSBTVFJFQU0tU1RBUlQgaW1wbGljaXRfZG9jdW1lbnQ/IGV4cGxpY2l0X2RvY3VtZW50KiBTVFJFQU0tRU5ECisjIGltcGxpY2l0X2RvY3VtZW50IDo6PSBibG9ja19ub2RlIERPQ1VNRU5ULUVORCoKKyMgZXhwbGljaXRfZG9jdW1lbnQgOjo9IERJUkVDVElWRSogRE9DVU1FTlQtU1RBUlQgYmxvY2tfbm9kZT8gRE9DVU1FTlQtRU5EKgorIyBibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2UgOjo9CisjICAgICAgICAgICAgICAgICAgICAgICBBTElBUworIyAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIChibG9ja19jb250ZW50IHwgaW5kZW50bGVzc19ibG9ja19zZXF1ZW5jZSk/CisjICAgICAgICAgICAgICAgICAgICAgICB8IGJsb2NrX2NvbnRlbnQKKyMgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZW50bGVzc19ibG9ja19zZXF1ZW5jZQorIyBibG9ja19ub2RlICAgICAgICA6Oj0gQUxJQVMKKyMgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydGllcyBibG9ja19jb250ZW50PworIyAgICAgICAgICAgICAgICAgICAgICAgfCBibG9ja19jb250ZW50CisjIGZsb3dfbm9kZSAgICAgICAgIDo6PSBBTElBUworIyAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIGZsb3dfY29udGVudD8KKyMgICAgICAgICAgICAgICAgICAgICAgIHwgZmxvd19jb250ZW50CisjIHByb3BlcnRpZXMgICAgICAgIDo6PSBUQUcgQU5DSE9SPyB8IEFOQ0hPUiBUQUc/CisjIGJsb2NrX2NvbnRlbnQgICAgIDo6PSBibG9ja19jb2xsZWN0aW9uIHwgZmxvd19jb2xsZWN0aW9uIHwgU0NBTEFSCisjIGZsb3dfY29udGVudCAgICAgIDo6PSBmbG93X2NvbGxlY3Rpb24gfCBTQ0FMQVIKKyMgYmxvY2tfY29sbGVjdGlvbiAgOjo9IGJsb2NrX3NlcXVlbmNlIHwgYmxvY2tfbWFwcGluZworIyBmbG93X2NvbGxlY3Rpb24gICA6Oj0gZmxvd19zZXF1ZW5jZSB8IGZsb3dfbWFwcGluZworIyBibG9ja19zZXF1ZW5jZSAgICA6Oj0gQkxPQ0stU0VRVUVOQ0UtU1RBUlQgKEJMT0NLLUVOVFJZIGJsb2NrX25vZGU/KSogQkxPQ0stRU5ECisjIGluZGVudGxlc3Nfc2VxdWVuY2UgICA6Oj0gKEJMT0NLLUVOVFJZIGJsb2NrX25vZGU/KSsKKyMgYmxvY2tfbWFwcGluZyAgICAgOjo9IEJMT0NLLU1BUFBJTkdfU1RBUlQKKyMgICAgICAgICAgICAgICAgICAgICAgICgoS0VZIGJsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZT8pPworIyAgICAgICAgICAgICAgICAgICAgICAgKFZBTFVFIGJsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZT8pPykqCisjICAgICAgICAgICAgICAgICAgICAgICBCTE9DSy1FTkQKKyMgZmxvd19zZXF1ZW5jZSAgICAgOjo9IEZMT1ctU0VRVUVOQ0UtU1RBUlQKKyMgICAgICAgICAgICAgICAgICAgICAgIChmbG93X3NlcXVlbmNlX2VudHJ5IEZMT1ctRU5UUlkpKgorIyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19zZXF1ZW5jZV9lbnRyeT8KKyMgICAgICAgICAgICAgICAgICAgICAgIEZMT1ctU0VRVUVOQ0UtRU5ECisjIGZsb3dfc2VxdWVuY2VfZW50cnkgICA6Oj0gZmxvd19ub2RlIHwgS0VZIGZsb3dfbm9kZT8gKFZBTFVFIGZsb3dfbm9kZT8pPworIyBmbG93X21hcHBpbmcgICAgICA6Oj0gRkxPVy1NQVBQSU5HLVNUQVJUCisjICAgICAgICAgICAgICAgICAgICAgICAoZmxvd19tYXBwaW5nX2VudHJ5IEZMT1ctRU5UUlkpKgorIyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19tYXBwaW5nX2VudHJ5PworIyAgICAgICAgICAgICAgICAgICAgICAgRkxPVy1NQVBQSU5HLUVORAorIyBmbG93X21hcHBpbmdfZW50cnkgICAgOjo9IGZsb3dfbm9kZSB8IEtFWSBmbG93X25vZGU/IChWQUxVRSBmbG93X25vZGU/KT8KKyMKKyMgRklSU1Qgc2V0czoKKyMKKyMgc3RyZWFtOiB7IFNUUkVBTS1TVEFSVCB9CisjIGV4cGxpY2l0X2RvY3VtZW50OiB7IERJUkVDVElWRSBET0NVTUVOVC1TVEFSVCB9CisjIGltcGxpY2l0X2RvY3VtZW50OiBGSVJTVChibG9ja19ub2RlKQorIyBibG9ja19ub2RlOiB7IEFMSUFTIFRBRyBBTkNIT1IgU0NBTEFSIEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgfQorIyBmbG93X25vZGU6IHsgQUxJQVMgQU5DSE9SIFRBRyBTQ0FMQVIgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgfQorIyBibG9ja19jb250ZW50OiB7IEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgU0NBTEFSIH0KKyMgZmxvd19jb250ZW50OiB7IEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIFNDQUxBUiB9CisjIGJsb2NrX2NvbGxlY3Rpb246IHsgQkxPQ0stU0VRVUVOQ0UtU1RBUlQgQkxPQ0stTUFQUElORy1TVEFSVCB9CisjIGZsb3dfY29sbGVjdGlvbjogeyBGTE9XLVNFUVVFTkNFLVNUQVJUIEZMT1ctTUFQUElORy1TVEFSVCB9CisjIGJsb2NrX3NlcXVlbmNlOiB7IEJMT0NLLVNFUVVFTkNFLVNUQVJUIH0KKyMgYmxvY2tfbWFwcGluZzogeyBCTE9DSy1NQVBQSU5HLVNUQVJUIH0KKyMgYmxvY2tfbm9kZV9vcl9pbmRlbnRsZXNzX3NlcXVlbmNlOiB7IEFMSUFTIEFOQ0hPUiBUQUcgU0NBTEFSIEJMT0NLLVNFUVVFTkNFLVNUQVJUIEJMT0NLLU1BUFBJTkctU1RBUlQgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgQkxPQ0stRU5UUlkgfQorIyBpbmRlbnRsZXNzX3NlcXVlbmNlOiB7IEVOVFJZIH0KKyMgZmxvd19jb2xsZWN0aW9uOiB7IEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIH0KKyMgZmxvd19zZXF1ZW5jZTogeyBGTE9XLVNFUVVFTkNFLVNUQVJUIH0KKyMgZmxvd19tYXBwaW5nOiB7IEZMT1ctTUFQUElORy1TVEFSVCB9CisjIGZsb3dfc2VxdWVuY2VfZW50cnk6IHsgQUxJQVMgQU5DSE9SIFRBRyBTQ0FMQVIgRkxPVy1TRVFVRU5DRS1TVEFSVCBGTE9XLU1BUFBJTkctU1RBUlQgS0VZIH0KKyMgZmxvd19tYXBwaW5nX2VudHJ5OiB7IEFMSUFTIEFOQ0hPUiBUQUcgU0NBTEFSIEZMT1ctU0VRVUVOQ0UtU1RBUlQgRkxPVy1NQVBQSU5HLVNUQVJUIEtFWSB9CisKK19fYWxsX18gPSBbJ1BhcnNlcicsICdQYXJzZXJFcnJvciddCisKK2Zyb20gLmVycm9yIGltcG9ydCBNYXJrZWRZQU1MRXJyb3IKK2Zyb20gLnRva2VucyBpbXBvcnQgKgorZnJvbSAuZXZlbnRzIGltcG9ydCAqCitmcm9tIC5zY2FubmVyIGltcG9ydCAqCisKK2NsYXNzIFBhcnNlckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBQYXJzZXI6CisgICAgIyBTaW5jZSB3cml0aW5nIGEgcmVjdXJzaXZlLWRlc2NlbmRhbnQgcGFyc2VyIGlzIGEgc3RyYWlnaHRmb3J3YXJkIHRhc2ssIHdlCisgICAgIyBkbyBub3QgZ2l2ZSBtYW55IGNvbW1lbnRzIGhlcmUuCisKKyAgICBERUZBVUxUX1RBR1MgPSB7CisgICAgICAgICchJzogICAnIScsCisgICAgICAgICchISc6ICAndGFnOnlhbWwub3JnLDIwMDI6JywKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudF9ldmVudCA9IE5vbmUKKyAgICAgICAgc2VsZi55YW1sX3ZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYudGFnX2hhbmRsZXMgPSB7fQorICAgICAgICBzZWxmLnN0YXRlcyA9IFtdCisgICAgICAgIHNlbGYubWFya3MgPSBbXQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9zdHJlYW1fc3RhcnQKKworICAgIGRlZiBkaXNwb3NlKHNlbGYpOgorICAgICAgICAjIFJlc2V0IHRoZSBzdGF0ZSBhdHRyaWJ1dGVzICh0byBjbGVhciBzZWxmLXJlZmVyZW5jZXMpCisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKKworICAgIGRlZiBjaGVja19ldmVudChzZWxmLCAqY2hvaWNlcyk6CisgICAgICAgICMgQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIG5leHQgZXZlbnQuCisgICAgICAgIGlmIHNlbGYuY3VycmVudF9ldmVudCBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZToKKyAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBzZWxmLnN0YXRlKCkKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2V2ZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IGNob2ljZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZvciBjaG9pY2UgaW4gY2hvaWNlczoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY3VycmVudF9ldmVudCwgY2hvaWNlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcGVla19ldmVudChzZWxmKToKKyAgICAgICAgIyBHZXQgdGhlIG5leHQgZXZlbnQuCisgICAgICAgIGlmIHNlbGYuY3VycmVudF9ldmVudCBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZToKKyAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBzZWxmLnN0YXRlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9ldmVudAorCisgICAgZGVmIGdldF9ldmVudChzZWxmKToKKyAgICAgICAgIyBHZXQgdGhlIG5leHQgZXZlbnQgYW5kIHByb2NlZWQgZnVydGhlci4KKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2V2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRlOgorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9ldmVudCA9IHNlbGYuc3RhdGUoKQorICAgICAgICB2YWx1ZSA9IHNlbGYuY3VycmVudF9ldmVudAorICAgICAgICBzZWxmLmN1cnJlbnRfZXZlbnQgPSBOb25lCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgIyBzdHJlYW0gICAgOjo9IFNUUkVBTS1TVEFSVCBpbXBsaWNpdF9kb2N1bWVudD8gZXhwbGljaXRfZG9jdW1lbnQqIFNUUkVBTS1FTkQKKyAgICAjIGltcGxpY2l0X2RvY3VtZW50IDo6PSBibG9ja19ub2RlIERPQ1VNRU5ULUVORCoKKyAgICAjIGV4cGxpY2l0X2RvY3VtZW50IDo6PSBESVJFQ1RJVkUqIERPQ1VNRU5ULVNUQVJUIGJsb2NrX25vZGU/IERPQ1VNRU5ULUVORCoKKworICAgIGRlZiBwYXJzZV9zdHJlYW1fc3RhcnQoc2VsZik6CisKKyAgICAgICAgIyBQYXJzZSB0aGUgc3RyZWFtIHN0YXJ0LgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgZXZlbnQgPSBTdHJlYW1TdGFydEV2ZW50KHRva2VuLnN0YXJ0X21hcmssIHRva2VuLmVuZF9tYXJrLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPXRva2VuLmVuY29kaW5nKQorCisgICAgICAgICMgUHJlcGFyZSB0aGUgbmV4dCBzdGF0ZS4KKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfaW1wbGljaXRfZG9jdW1lbnRfc3RhcnQKKworICAgICAgICByZXR1cm4gZXZlbnQKKworICAgIGRlZiBwYXJzZV9pbXBsaWNpdF9kb2N1bWVudF9zdGFydChzZWxmKToKKworICAgICAgICAjIFBhcnNlIGFuIGltcGxpY2l0IGRvY3VtZW50LgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihEaXJlY3RpdmVUb2tlbiwgRG9jdW1lbnRTdGFydFRva2VuLAorICAgICAgICAgICAgICAgIFN0cmVhbUVuZFRva2VuKToKKyAgICAgICAgICAgIHNlbGYudGFnX2hhbmRsZXMgPSBzZWxmLkRFRkFVTFRfVEFHUworICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgc3RhcnRfbWFyayA9IGVuZF9tYXJrID0gdG9rZW4uc3RhcnRfbWFyaworICAgICAgICAgICAgZXZlbnQgPSBEb2N1bWVudFN0YXJ0RXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0PUZhbHNlKQorCisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIG5leHQgc3RhdGUuCisgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9kb2N1bWVudF9lbmQpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9ibG9ja19ub2RlCisKKyAgICAgICAgICAgIHJldHVybiBldmVudAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9kb2N1bWVudF9zdGFydCgpCisKKyAgICBkZWYgcGFyc2VfZG9jdW1lbnRfc3RhcnQoc2VsZik6CisKKyAgICAgICAgIyBQYXJzZSBhbnkgZXh0cmEgZG9jdW1lbnQgZW5kIGluZGljYXRvcnMuCisgICAgICAgIHdoaWxlIHNlbGYuY2hlY2tfdG9rZW4oRG9jdW1lbnRFbmRUb2tlbik6CisgICAgICAgICAgICBzZWxmLmdldF90b2tlbigpCisKKyAgICAgICAgIyBQYXJzZSBhbiBleHBsaWNpdCBkb2N1bWVudC4KKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oU3RyZWFtRW5kVG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgc3RhcnRfbWFyayA9IHRva2VuLnN0YXJ0X21hcmsKKyAgICAgICAgICAgIHZlcnNpb24sIHRhZ3MgPSBzZWxmLnByb2Nlc3NfZGlyZWN0aXZlcygpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihEb2N1bWVudFN0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJzxkb2N1bWVudCBzdGFydD4nLCBidXQgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIHNlbGYucGVla190b2tlbigpLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wZWVrX3Rva2VuKCkuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgZXZlbnQgPSBEb2N1bWVudFN0YXJ0RXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0PVRydWUsIHZlcnNpb249dmVyc2lvbiwgdGFncz10YWdzKQorICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYucGFyc2VfZG9jdW1lbnRfZW5kKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZG9jdW1lbnRfY29udGVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJzZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGV2ZW50ID0gU3RyZWFtRW5kRXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmspCisgICAgICAgICAgICBhc3NlcnQgbm90IHNlbGYuc3RhdGVzCisgICAgICAgICAgICBhc3NlcnQgbm90IHNlbGYubWFya3MKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgZGVmIHBhcnNlX2RvY3VtZW50X2VuZChzZWxmKToKKworICAgICAgICAjIFBhcnNlIHRoZSBkb2N1bWVudCBlbmQuCisgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgc3RhcnRfbWFyayA9IGVuZF9tYXJrID0gdG9rZW4uc3RhcnRfbWFyaworICAgICAgICBleHBsaWNpdCA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oRG9jdW1lbnRFbmRUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGVuZF9tYXJrID0gdG9rZW4uZW5kX21hcmsKKyAgICAgICAgICAgIGV4cGxpY2l0ID0gVHJ1ZQorICAgICAgICBldmVudCA9IERvY3VtZW50RW5kRXZlbnQoc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgZXhwbGljaXQ9ZXhwbGljaXQpCisKKyAgICAgICAgIyBQcmVwYXJlIHRoZSBuZXh0IHN0YXRlLgorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9kb2N1bWVudF9zdGFydAorCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgZGVmIHBhcnNlX2RvY3VtZW50X2NvbnRlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oRGlyZWN0aXZlVG9rZW4sCisgICAgICAgICAgICAgICAgRG9jdW1lbnRTdGFydFRva2VuLCBEb2N1bWVudEVuZFRva2VuLCBTdHJlYW1FbmRUb2tlbik6CisgICAgICAgICAgICBldmVudCA9IHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIoc2VsZi5wZWVrX3Rva2VuKCkuc3RhcnRfbWFyaykKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICAgICAgcmV0dXJuIGV2ZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ibG9ja19ub2RlKCkKKworICAgIGRlZiBwcm9jZXNzX2RpcmVjdGl2ZXMoc2VsZik6CisgICAgICAgIHNlbGYueWFtbF92ZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLnRhZ19oYW5kbGVzID0ge30KKyAgICAgICAgd2hpbGUgc2VsZi5jaGVja190b2tlbihEaXJlY3RpdmVUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGlmIHRva2VuLm5hbWUgPT0gJ1lBTUwnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYueWFtbF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBkdXBsaWNhdGUgWUFNTCBkaXJlY3RpdmUiLCB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vciA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICAgICAgaWYgbWFqb3IgIT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgaW5jb21wYXRpYmxlIFlBTUwgZG9jdW1lbnQgKHZlcnNpb24gMS4qIGlzIHJlcXVpcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgICAgICAgICBzZWxmLnlhbWxfdmVyc2lvbiA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICBlbGlmIHRva2VuLm5hbWUgPT0gJ1RBRyc6CisgICAgICAgICAgICAgICAgaGFuZGxlLCBwcmVmaXggPSB0b2tlbi52YWx1ZQorICAgICAgICAgICAgICAgIGlmIGhhbmRsZSBpbiBzZWxmLnRhZ19oYW5kbGVzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUgdGFnIGhhbmRsZSAlciIgJSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgICAgICAgICBzZWxmLnRhZ19oYW5kbGVzW2hhbmRsZV0gPSBwcmVmaXgKKyAgICAgICAgaWYgc2VsZi50YWdfaGFuZGxlczoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi55YW1sX3ZlcnNpb24sIHNlbGYudGFnX2hhbmRsZXMuY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYueWFtbF92ZXJzaW9uLCBOb25lCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5ERUZBVUxUX1RBR1M6CisgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlbGYudGFnX2hhbmRsZXM6CisgICAgICAgICAgICAgICAgc2VsZi50YWdfaGFuZGxlc1trZXldID0gc2VsZi5ERUZBVUxUX1RBR1Nba2V5XQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICMgYmxvY2tfbm9kZV9vcl9pbmRlbnRsZXNzX3NlcXVlbmNlIDo6PSBBTElBUworICAgICMgICAgICAgICAgICAgICB8IHByb3BlcnRpZXMgKGJsb2NrX2NvbnRlbnQgfCBpbmRlbnRsZXNzX2Jsb2NrX3NlcXVlbmNlKT8KKyAgICAjICAgICAgICAgICAgICAgfCBibG9ja19jb250ZW50CisgICAgIyAgICAgICAgICAgICAgIHwgaW5kZW50bGVzc19ibG9ja19zZXF1ZW5jZQorICAgICMgYmxvY2tfbm9kZSAgICA6Oj0gQUxJQVMKKyAgICAjICAgICAgICAgICAgICAgICAgIHwgcHJvcGVydGllcyBibG9ja19jb250ZW50PworICAgICMgICAgICAgICAgICAgICAgICAgfCBibG9ja19jb250ZW50CisgICAgIyBmbG93X25vZGUgICAgIDo6PSBBTElBUworICAgICMgICAgICAgICAgICAgICAgICAgfCBwcm9wZXJ0aWVzIGZsb3dfY29udGVudD8KKyAgICAjICAgICAgICAgICAgICAgICAgIHwgZmxvd19jb250ZW50CisgICAgIyBwcm9wZXJ0aWVzICAgIDo6PSBUQUcgQU5DSE9SPyB8IEFOQ0hPUiBUQUc/CisgICAgIyBibG9ja19jb250ZW50ICAgICA6Oj0gYmxvY2tfY29sbGVjdGlvbiB8IGZsb3dfY29sbGVjdGlvbiB8IFNDQUxBUgorICAgICMgZmxvd19jb250ZW50ICAgICAgOjo9IGZsb3dfY29sbGVjdGlvbiB8IFNDQUxBUgorICAgICMgYmxvY2tfY29sbGVjdGlvbiAgOjo9IGJsb2NrX3NlcXVlbmNlIHwgYmxvY2tfbWFwcGluZworICAgICMgZmxvd19jb2xsZWN0aW9uICAgOjo9IGZsb3dfc2VxdWVuY2UgfCBmbG93X21hcHBpbmcKKworICAgIGRlZiBwYXJzZV9ibG9ja19ub2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ub2RlKGJsb2NrPVRydWUpCisKKyAgICBkZWYgcGFyc2VfZmxvd19ub2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ub2RlKCkKKworICAgIGRlZiBwYXJzZV9ibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX25vZGUoYmxvY2s9VHJ1ZSwgaW5kZW50bGVzc19zZXF1ZW5jZT1UcnVlKQorCisgICAgZGVmIHBhcnNlX25vZGUoc2VsZiwgYmxvY2s9RmFsc2UsIGluZGVudGxlc3Nfc2VxdWVuY2U9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKEFsaWFzVG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBldmVudCA9IEFsaWFzRXZlbnQodG9rZW4udmFsdWUsIHRva2VuLnN0YXJ0X21hcmssIHRva2VuLmVuZF9tYXJrKQorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbmNob3IgPSBOb25lCisgICAgICAgICAgICB0YWcgPSBOb25lCisgICAgICAgICAgICBzdGFydF9tYXJrID0gZW5kX21hcmsgPSB0YWdfbWFyayA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oQW5jaG9yVG9rZW4pOgorICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIHN0YXJ0X21hcmsgPSB0b2tlbi5zdGFydF9tYXJrCisgICAgICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgICAgIGFuY2hvciA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihUYWdUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgICAgICB0YWdfbWFyayA9IHRva2VuLnN0YXJ0X21hcmsKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgICAgICAgICB0YWcgPSB0b2tlbi52YWx1ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmNoZWNrX3Rva2VuKFRhZ1Rva2VuKToKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBzdGFydF9tYXJrID0gdGFnX21hcmsgPSB0b2tlbi5zdGFydF9tYXJrCisgICAgICAgICAgICAgICAgZW5kX21hcmsgPSB0b2tlbi5lbmRfbWFyaworICAgICAgICAgICAgICAgIHRhZyA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihBbmNob3JUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHRva2VuLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IHRva2VuLnZhbHVlCisgICAgICAgICAgICBpZiB0YWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaGFuZGxlLCBzdWZmaXggPSB0YWcKKyAgICAgICAgICAgICAgICBpZiBoYW5kbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIGhhbmRsZSBub3QgaW4gc2VsZi50YWdfaGFuZGxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgbm9kZSIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmRlZmluZWQgdGFnIGhhbmRsZSAlciIgJSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19tYXJrKQorICAgICAgICAgICAgICAgICAgICB0YWcgPSBzZWxmLnRhZ19oYW5kbGVzW2hhbmRsZV0rc3VmZml4CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFnID0gc3VmZml4CisgICAgICAgICAgICAjaWYgdGFnID09ICchJzoKKyAgICAgICAgICAgICMgICAgcmFpc2UgUGFyc2VyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSBub2RlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICMgICAgICAgICAgICAiZm91bmQgbm9uLXNwZWNpZmljIHRhZyAnISciLCB0YWdfbWFyaywKKyAgICAgICAgICAgICMgICAgICAgICAgICAiUGxlYXNlIGNoZWNrICdodHRwOi8vcHl5YW1sLm9yZy93aWtpL1lBTUxOb25TcGVjaWZpY1RhZycgYW5kIHNoYXJlIHlvdXIgb3Bpbmlvbi4iKQorICAgICAgICAgICAgaWYgc3RhcnRfbWFyayBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0YXJ0X21hcmsgPSBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLnN0YXJ0X21hcmsKKyAgICAgICAgICAgIGV2ZW50ID0gTm9uZQorICAgICAgICAgICAgaW1wbGljaXQgPSAodGFnIGlzIE5vbmUgb3IgdGFnID09ICchJykKKyAgICAgICAgICAgIGlmIGluZGVudGxlc3Nfc2VxdWVuY2UgYW5kIHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbnRyeVRva2VuKToKKyAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgZXZlbnQgPSBTZXF1ZW5jZVN0YXJ0RXZlbnQoYW5jaG9yLCB0YWcsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmspCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfaW5kZW50bGVzc19zZXF1ZW5jZV9lbnRyeQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKFNjYWxhclRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgICAgIGVuZF9tYXJrID0gdG9rZW4uZW5kX21hcmsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnBsYWluIGFuZCB0YWcgaXMgTm9uZSkgb3IgdGFnID09ICchJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gKFRydWUsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHRhZyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAoRmFsc2UsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IChGYWxzZSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2NhbGFyRXZlbnQoYW5jaG9yLCB0YWcsIGltcGxpY2l0LCB0b2tlbi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaywgc3R5bGU9dG9rZW4uc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jaGVja190b2tlbihGbG93U2VxdWVuY2VTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLnBlZWtfdG9rZW4oKS5lbmRfbWFyaworICAgICAgICAgICAgICAgICAgICBldmVudCA9IFNlcXVlbmNlU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIGZsb3dfc3R5bGU9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9maXJzdF9lbnRyeQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jaGVja190b2tlbihGbG93TWFwcGluZ1N0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLmVuZF9tYXJrCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gTWFwcGluZ1N0YXJ0RXZlbnQoYW5jaG9yLCB0YWcsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBmbG93X3N0eWxlPVRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19maXJzdF9rZXkKKyAgICAgICAgICAgICAgICBlbGlmIGJsb2NrIGFuZCBzZWxmLmNoZWNrX3Rva2VuKEJsb2NrU2VxdWVuY2VTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLnBlZWtfdG9rZW4oKS5zdGFydF9tYXJrCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2VxdWVuY2VTdGFydEV2ZW50KGFuY2hvciwgdGFnLCBpbXBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaywgZmxvd19zdHlsZT1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfYmxvY2tfc2VxdWVuY2VfZmlyc3RfZW50cnkKKyAgICAgICAgICAgICAgICBlbGlmIGJsb2NrIGFuZCBzZWxmLmNoZWNrX3Rva2VuKEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYucGVla190b2tlbigpLnN0YXJ0X21hcmsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBNYXBwaW5nU3RhcnRFdmVudChhbmNob3IsIHRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbWFyaywgZW5kX21hcmssIGZsb3dfc3R5bGU9RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfZmlyc3Rfa2V5CisgICAgICAgICAgICAgICAgZWxpZiBhbmNob3IgaXMgbm90IE5vbmUgb3IgdGFnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IHNjYWxhcnMgYXJlIGFsbG93ZWQgZXZlbiBpZiBhIHRhZyBvciBhbiBhbmNob3IgaXMKKyAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gU2NhbGFyRXZlbnQoYW5jaG9yLCB0YWcsIChpbXBsaWNpdCwgRmFsc2UpLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9tYXJrLCBlbmRfbWFyaykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gJ2Jsb2NrJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9ICdmbG93JworICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgJXMgbm9kZSIgJSBub2RlLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0aGUgbm9kZSBjb250ZW50LCBidXQgZm91bmQgJXIiICUgdG9rZW4uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICAjIGJsb2NrX3NlcXVlbmNlIDo6PSBCTE9DSy1TRVFVRU5DRS1TVEFSVCAoQkxPQ0stRU5UUlkgYmxvY2tfbm9kZT8pKiBCTE9DSy1FTkQKKworICAgIGRlZiBwYXJzZV9ibG9ja19zZXF1ZW5jZV9maXJzdF9lbnRyeShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIHNlbGYubWFya3MuYXBwZW5kKHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX3NlcXVlbmNlX2VudHJ5KCkKKworICAgIGRlZiBwYXJzZV9ibG9ja19zZXF1ZW5jZV9lbnRyeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihCbG9ja0VudHJ5VG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihCbG9ja0VudHJ5VG9rZW4sIEJsb2NrRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Jsb2NrX3NlcXVlbmNlX2VudHJ5KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX25vZGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9ibG9ja19zZXF1ZW5jZV9lbnRyeQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihCbG9ja0VuZFRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgYmxvY2sgY29sbGVjdGlvbiIsIHNlbGYubWFya3NbLTFdLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgPGJsb2NrIGVuZD4sIGJ1dCBmb3VuZCAlciIgJSB0b2tlbi5pZCwgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIGV2ZW50ID0gU2VxdWVuY2VFbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIHNlbGYubWFya3MucG9wKCkKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICAjIGluZGVudGxlc3Nfc2VxdWVuY2UgOjo9IChCTE9DSy1FTlRSWSBibG9ja19ub2RlPykrCisKKyAgICBkZWYgcGFyc2VfaW5kZW50bGVzc19zZXF1ZW5jZV9lbnRyeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihCbG9ja0VudHJ5VG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihCbG9ja0VudHJ5VG9rZW4sCisgICAgICAgICAgICAgICAgICAgIEtleVRva2VuLCBWYWx1ZVRva2VuLCBCbG9ja0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9pbmRlbnRsZXNzX3NlcXVlbmNlX2VudHJ5KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX25vZGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9pbmRlbnRsZXNzX3NlcXVlbmNlX2VudHJ5CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uZW5kX21hcmspCisgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgZXZlbnQgPSBTZXF1ZW5jZUVuZEV2ZW50KHRva2VuLnN0YXJ0X21hcmssIHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICByZXR1cm4gZXZlbnQKKworICAgICMgYmxvY2tfbWFwcGluZyAgICAgOjo9IEJMT0NLLU1BUFBJTkdfU1RBUlQKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAoKEtFWSBibG9ja19ub2RlX29yX2luZGVudGxlc3Nfc2VxdWVuY2U/KT8KKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAoVkFMVUUgYmxvY2tfbm9kZV9vcl9pbmRlbnRsZXNzX3NlcXVlbmNlPyk/KSoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICBCTE9DSy1FTkQKKworICAgIGRlZiBwYXJzZV9ibG9ja19tYXBwaW5nX2ZpcnN0X2tleShzZWxmKToKKyAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgIHNlbGYubWFya3MuYXBwZW5kKHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfa2V5KCkKKworICAgIGRlZiBwYXJzZV9ibG9ja19tYXBwaW5nX2tleShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihLZXlUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKEtleVRva2VuLCBWYWx1ZVRva2VuLCBCbG9ja0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlcy5hcHBlbmQoc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfdmFsdWUKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2VtcHR5X3NjYWxhcih0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oQmxvY2tFbmRUb2tlbik6CisgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICByYWlzZSBQYXJzZXJFcnJvcigid2hpbGUgcGFyc2luZyBhIGJsb2NrIG1hcHBpbmciLCBzZWxmLm1hcmtzWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIDxibG9jayBlbmQ+LCBidXQgZm91bmQgJXIiICUgdG9rZW4uaWQsIHRva2VuLnN0YXJ0X21hcmspCisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBldmVudCA9IE1hcHBpbmdFbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5lbmRfbWFyaykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGVzLnBvcCgpCisgICAgICAgIHNlbGYubWFya3MucG9wKCkKKyAgICAgICAgcmV0dXJuIGV2ZW50CisKKyAgICBkZWYgcGFyc2VfYmxvY2tfbWFwcGluZ192YWx1ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihWYWx1ZVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oS2V5VG9rZW4sIFZhbHVlVG9rZW4sIEJsb2NrRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfa2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2Jsb2NrX25vZGVfb3JfaW5kZW50bGVzc19zZXF1ZW5jZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Jsb2NrX21hcHBpbmdfa2V5CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uZW5kX21hcmspCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9ibG9ja19tYXBwaW5nX2tleQorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uc3RhcnRfbWFyaykKKworICAgICMgZmxvd19zZXF1ZW5jZSAgICAgOjo9IEZMT1ctU0VRVUVOQ0UtU1RBUlQKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAoZmxvd19zZXF1ZW5jZV9lbnRyeSBGTE9XLUVOVFJZKSoKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICBmbG93X3NlcXVlbmNlX2VudHJ5PworICAgICMgICAgICAgICAgICAgICAgICAgICAgIEZMT1ctU0VRVUVOQ0UtRU5ECisgICAgIyBmbG93X3NlcXVlbmNlX2VudHJ5ICAgOjo9IGZsb3dfbm9kZSB8IEtFWSBmbG93X25vZGU/IChWQUxVRSBmbG93X25vZGU/KT8KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgd2hpbGUgcHJvZHVjdGlvbiBydWxlcyBmb3IgYm90aCBmbG93X3NlcXVlbmNlX2VudHJ5IGFuZAorICAgICMgZmxvd19tYXBwaW5nX2VudHJ5IGFyZSBlcXVhbCwgdGhlaXIgaW50ZXJwcmV0YXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAgIyBGb3IgYGZsb3dfc2VxdWVuY2VfZW50cnlgLCB0aGUgcGFydCBgS0VZIGZsb3dfbm9kZT8gKFZBTFVFIGZsb3dfbm9kZT8pP2AKKyAgICAjIGdlbmVyYXRlIGFuIGlubGluZSBtYXBwaW5nIChzZXQgc3ludGF4KS4KKworICAgIGRlZiBwYXJzZV9mbG93X3NlcXVlbmNlX2ZpcnN0X2VudHJ5KHNlbGYpOgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgc2VsZi5tYXJrcy5hcHBlbmQodG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeShmaXJzdD1UcnVlKQorCisgICAgZGVmIHBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnkoc2VsZiwgZmlyc3Q9RmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihGbG93U2VxdWVuY2VFbmRUb2tlbik6CisgICAgICAgICAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihGbG93RW50cnlUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlckVycm9yKCJ3aGlsZSBwYXJzaW5nIGEgZmxvdyBzZXF1ZW5jZSIsIHNlbGYubWFya3NbLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnLCcgb3IgJ10nLCBidXQgZ290ICVyIiAlIHRva2VuLmlkLCB0b2tlbi5zdGFydF9tYXJrKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKEtleVRva2VuKToKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYucGVla190b2tlbigpCisgICAgICAgICAgICAgICAgZXZlbnQgPSBNYXBwaW5nU3RhcnRFdmVudChOb25lLCBOb25lLCBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICBmbG93X3N0eWxlPVRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX2tleQorICAgICAgICAgICAgICAgIHJldHVybiBldmVudAorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5jaGVja190b2tlbihGbG93U2VxdWVuY2VFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9mbG93X25vZGUoKQorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgZXZlbnQgPSBTZXF1ZW5jZUVuZEV2ZW50KHRva2VuLnN0YXJ0X21hcmssIHRva2VuLmVuZF9tYXJrKQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZXMucG9wKCkKKyAgICAgICAgc2VsZi5tYXJrcy5wb3AoKQorICAgICAgICByZXR1cm4gZXZlbnQKKworICAgIGRlZiBwYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5X21hcHBpbmdfa2V5KHNlbGYpOgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oVmFsdWVUb2tlbiwKKyAgICAgICAgICAgICAgICBGbG93RW50cnlUb2tlbiwgRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgc2VsZi5zdGF0ZXMuYXBwZW5kKHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX3ZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ192YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uZW5kX21hcmspCisKKyAgICBkZWYgcGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX3ZhbHVlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKFZhbHVlVG9rZW4pOgorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihGbG93RW50cnlUb2tlbiwgRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfc2VxdWVuY2VfZW50cnlfbWFwcGluZ19lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX2VuZAorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19zZXF1ZW5jZV9lbnRyeV9tYXBwaW5nX2VuZAorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uc3RhcnRfbWFyaykKKworICAgIGRlZiBwYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5X21hcHBpbmdfZW5kKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9mbG93X3NlcXVlbmNlX2VudHJ5CisgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgcmV0dXJuIE1hcHBpbmdFbmRFdmVudCh0b2tlbi5zdGFydF9tYXJrLCB0b2tlbi5zdGFydF9tYXJrKQorCisgICAgIyBmbG93X21hcHBpbmcgIDo6PSBGTE9XLU1BUFBJTkctU1RBUlQKKyAgICAjICAgICAgICAgICAgICAgICAgIChmbG93X21hcHBpbmdfZW50cnkgRkxPVy1FTlRSWSkqCisgICAgIyAgICAgICAgICAgICAgICAgICBmbG93X21hcHBpbmdfZW50cnk/CisgICAgIyAgICAgICAgICAgICAgICAgICBGTE9XLU1BUFBJTkctRU5ECisgICAgIyBmbG93X21hcHBpbmdfZW50cnkgICAgOjo9IGZsb3dfbm9kZSB8IEtFWSBmbG93X25vZGU/IChWQUxVRSBmbG93X25vZGU/KT8KKworICAgIGRlZiBwYXJzZV9mbG93X21hcHBpbmdfZmlyc3Rfa2V5KHNlbGYpOgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgc2VsZi5tYXJrcy5hcHBlbmQodG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19tYXBwaW5nX2tleShmaXJzdD1UcnVlKQorCisgICAgZGVmIHBhcnNlX2Zsb3dfbWFwcGluZ19rZXkoc2VsZiwgZmlyc3Q9RmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbihGbG93TWFwcGluZ0VuZFRva2VuKToKKyAgICAgICAgICAgIGlmIG5vdCBmaXJzdDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKEZsb3dFbnRyeVRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5wZWVrX3Rva2VuKCkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSBmbG93IG1hcHBpbmciLCBzZWxmLm1hcmtzWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJywnIG9yICd9JywgYnV0IGdvdCAlciIgJSB0b2tlbi5pZCwgdG9rZW4uc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oS2V5VG9rZW4pOgorICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKFZhbHVlVG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGbG93RW50cnlUb2tlbiwgRmxvd01hcHBpbmdFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ192YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5wYXJzZV9mbG93X21hcHBpbmdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uZW5kX21hcmspCisgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKEZsb3dNYXBwaW5nRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19lbXB0eV92YWx1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9mbG93X25vZGUoKQorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgZXZlbnQgPSBNYXBwaW5nRW5kRXZlbnQodG9rZW4uc3RhcnRfbWFyaywgdG9rZW4uZW5kX21hcmspCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlcy5wb3AoKQorICAgICAgICBzZWxmLm1hcmtzLnBvcCgpCisgICAgICAgIHJldHVybiBldmVudAorCisgICAgZGVmIHBhcnNlX2Zsb3dfbWFwcGluZ192YWx1ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbihWYWx1ZVRva2VuKToKKyAgICAgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oRmxvd0VudHJ5VG9rZW4sIEZsb3dNYXBwaW5nRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzLmFwcGVuZChzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19rZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfZmxvd19ub2RlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19tYXBwaW5nX2tleQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZW1wdHlfc2NhbGFyKHRva2VuLmVuZF9tYXJrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucGFyc2VfZmxvd19tYXBwaW5nX2tleQorICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnBlZWtfdG9rZW4oKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIodG9rZW4uc3RhcnRfbWFyaykKKworICAgIGRlZiBwYXJzZV9mbG93X21hcHBpbmdfZW1wdHlfdmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnBhcnNlX2Zsb3dfbWFwcGluZ19rZXkKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19lbXB0eV9zY2FsYXIoc2VsZi5wZWVrX3Rva2VuKCkuc3RhcnRfbWFyaykKKworICAgIGRlZiBwcm9jZXNzX2VtcHR5X3NjYWxhcihzZWxmLCBtYXJrKToKKyAgICAgICAgcmV0dXJuIFNjYWxhckV2ZW50KE5vbmUsIE5vbmUsIChUcnVlLCBGYWxzZSksICcnLCBtYXJrLCBtYXJrKQorCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvcmVhZGVyLnB5IGIvbGliMy95YW1sL3JlYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBlOTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL3JlYWRlci5weQpAQCAtMCwwICsxLDE5MiBAQAorIyBUaGlzIG1vZHVsZSBjb250YWlucyBhYnN0cmFjdGlvbnMgZm9yIHRoZSBpbnB1dCBzdHJlYW0uIFlvdSBkb24ndCBoYXZlIHRvCisjIGxvb2tzIGZ1cnRoZXIsIHRoZXJlIGFyZSBubyBwcmV0dHkgY29kZS4KKyMKKyMgV2UgZGVmaW5lIHR3byBjbGFzc2VzIGhlcmUuCisjCisjICAgTWFyayhzb3VyY2UsIGxpbmUsIGNvbHVtbikKKyMgSXQncyBqdXN0IGEgcmVjb3JkIGFuZCBpdHMgb25seSB1c2UgaXMgcHJvZHVjaW5nIG5pY2UgZXJyb3IgbWVzc2FnZXMuCisjIFBhcnNlciBkb2VzIG5vdCB1c2UgaXQgZm9yIGFueSBvdGhlciBwdXJwb3Nlcy4KKyMKKyMgICBSZWFkZXIoc291cmNlLCBkYXRhKQorIyBSZWFkZXIgZGV0ZXJtaW5lcyB0aGUgZW5jb2Rpbmcgb2YgYGRhdGFgIGFuZCBjb252ZXJ0cyBpdCB0byB1bmljb2RlLgorIyBSZWFkZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorIyAgIHJlYWRlci5wZWVrKGxlbmd0aD0xKSAtIHJldHVybiB0aGUgbmV4dCBgbGVuZ3RoYCBjaGFyYWN0ZXJzCisjICAgcmVhZGVyLmZvcndhcmQobGVuZ3RoPTEpIC0gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byBgbGVuZ3RoYCBjaGFyYWN0ZXJzLgorIyAgIHJlYWRlci5pbmRleCAtIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorIyAgIHJlYWRlci5saW5lLCBzdHJlYW0uY29sdW1uIC0gdGhlIGxpbmUgYW5kIHRoZSBjb2x1bW4gb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCitfX2FsbF9fID0gWydSZWFkZXInLCAnUmVhZGVyRXJyb3InXQorCitmcm9tIC5lcnJvciBpbXBvcnQgWUFNTEVycm9yLCBNYXJrCisKK2ltcG9ydCBjb2RlY3MsIHJlCisKK2NsYXNzIFJlYWRlckVycm9yKFlBTUxFcnJvcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcG9zaXRpb24sIGNoYXJhY3RlciwgZW5jb2RpbmcsIHJlYXNvbik6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jaGFyYWN0ZXIgPSBjaGFyYWN0ZXIKKyAgICAgICAgc2VsZi5wb3NpdGlvbiA9IHBvc2l0aW9uCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jaGFyYWN0ZXIsIGJ5dGVzKToKKyAgICAgICAgICAgIHJldHVybiAiJyVzJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAjeCUwMng6ICVzXG4iICBcCisgICAgICAgICAgICAgICAgICAgICIgIGluIFwiJXNcIiwgcG9zaXRpb24gJWQiICAgIFwKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5lbmNvZGluZywgb3JkKHNlbGYuY2hhcmFjdGVyKSwgc2VsZi5yZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnBvc2l0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJ1bmFjY2VwdGFibGUgY2hhcmFjdGVyICN4JTA0eDogJXNcbiIgICAgXAorICAgICAgICAgICAgICAgICAgICAiICBpbiBcIiVzXCIsIHBvc2l0aW9uICVkIiAgICBcCisgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuY2hhcmFjdGVyLCBzZWxmLnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucG9zaXRpb24pCisKK2NsYXNzIFJlYWRlcihvYmplY3QpOgorICAgICMgUmVhZGVyOgorICAgICMgLSBkZXRlcm1pbmVzIHRoZSBkYXRhIGVuY29kaW5nIGFuZCBjb252ZXJ0cyBpdCB0byBhIHVuaWNvZGUgc3RyaW5nLAorICAgICMgLSBjaGVja3MgaWYgY2hhcmFjdGVycyBhcmUgaW4gYWxsb3dlZCByYW5nZSwKKyAgICAjIC0gYWRkcyAnXDAnIHRvIHRoZSBlbmQuCisKKyAgICAjIFJlYWRlciBhY2NlcHRzCisgICAgIyAgLSBhIGBieXRlc2Agb2JqZWN0LAorICAgICMgIC0gYSBgc3RyYCBvYmplY3QsCisgICAgIyAgLSBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBpdHMgYHJlYWRgIG1ldGhvZCByZXR1cm5pbmcgYHN0cmAsCisgICAgIyAgLSBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBpdHMgYHJlYWRgIG1ldGhvZCByZXR1cm5pbmcgYHVuaWNvZGVgLgorCisgICAgIyBZZWFoLCBpdCdzIHVnbHkgYW5kIHNsb3cuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtKToKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorICAgICAgICBzZWxmLnN0cmVhbSA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHJlYW1fcG9pbnRlciA9IDAKKyAgICAgICAgc2VsZi5lb2YgPSBUcnVlCisgICAgICAgIHNlbGYuYnVmZmVyID0gJycKKyAgICAgICAgc2VsZi5wb2ludGVyID0gMAorICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBOb25lCisgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbmRleCA9IDAKKyAgICAgICAgc2VsZi5saW5lID0gMAorICAgICAgICBzZWxmLmNvbHVtbiA9IDAKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzdHJlYW0sIHN0cik6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSAiPHVuaWNvZGUgc3RyaW5nPiIKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcHJpbnRhYmxlKHN0cmVhbSkKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc3RyZWFtKydcMCcKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0cmVhbSwgYnl0ZXMpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gIjxieXRlIHN0cmluZz4iCisgICAgICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBzdHJlYW0KKyAgICAgICAgICAgIHNlbGYuZGV0ZXJtaW5lX2VuY29kaW5nKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHN0cmVhbSwgJ25hbWUnLCAiPGZpbGU+IikKKyAgICAgICAgICAgIHNlbGYuZW9mID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYucmF3X2J1ZmZlciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZGV0ZXJtaW5lX2VuY29kaW5nKCkKKworICAgIGRlZiBwZWVrKHNlbGYsIGluZGV4PTApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5idWZmZXJbc2VsZi5wb2ludGVyK2luZGV4XQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGluZGV4KzEpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5idWZmZXJbc2VsZi5wb2ludGVyK2luZGV4XQorCisgICAgZGVmIHByZWZpeChzZWxmLCBsZW5ndGg9MSk6CisgICAgICAgIGlmIHNlbGYucG9pbnRlcitsZW5ndGggPj0gbGVuKHNlbGYuYnVmZmVyKToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyW3NlbGYucG9pbnRlcjpzZWxmLnBvaW50ZXIrbGVuZ3RoXQorCisgICAgZGVmIGZvcndhcmQoc2VsZiwgbGVuZ3RoPTEpOgorICAgICAgICBpZiBzZWxmLnBvaW50ZXIrbGVuZ3RoKzEgPj0gbGVuKHNlbGYuYnVmZmVyKToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGxlbmd0aCsxKQorICAgICAgICB3aGlsZSBsZW5ndGg6CisgICAgICAgICAgICBjaCA9IHNlbGYuYnVmZmVyW3NlbGYucG9pbnRlcl0KKyAgICAgICAgICAgIHNlbGYucG9pbnRlciArPSAxCisgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgIGlmIGNoIGluICdcblx4ODVcdTIwMjhcdTIwMjknICBcCisgICAgICAgICAgICAgICAgICAgIG9yIChjaCA9PSAnXHInIGFuZCBzZWxmLmJ1ZmZlcltzZWxmLnBvaW50ZXJdICE9ICdcbicpOgorICAgICAgICAgICAgICAgIHNlbGYubGluZSArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5jb2x1bW4gPSAwCisgICAgICAgICAgICBlbGlmIGNoICE9ICdcdUZFRkYnOgorICAgICAgICAgICAgICAgIHNlbGYuY29sdW1uICs9IDEKKyAgICAgICAgICAgIGxlbmd0aCAtPSAxCisKKyAgICBkZWYgZ2V0X21hcmsoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RyZWFtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTWFyayhzZWxmLm5hbWUsIHNlbGYuaW5kZXgsIHNlbGYubGluZSwgc2VsZi5jb2x1bW4sCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyLCBzZWxmLnBvaW50ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTWFyayhzZWxmLm5hbWUsIHNlbGYuaW5kZXgsIHNlbGYubGluZSwgc2VsZi5jb2x1bW4sCisgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZGV0ZXJtaW5lX2VuY29kaW5nKHNlbGYpOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5lb2YgYW5kIChzZWxmLnJhd19idWZmZXIgaXMgTm9uZSBvciBsZW4oc2VsZi5yYXdfYnVmZmVyKSA8IDIpOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfcmF3KCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnJhd19idWZmZXIsIGJ5dGVzKToKKyAgICAgICAgICAgIGlmIHNlbGYucmF3X2J1ZmZlci5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGMTZfTEUpOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9ICd1dGYtMTYtbGUnCisgICAgICAgICAgICBlbGlmIHNlbGYucmF3X2J1ZmZlci5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGMTZfQkUpOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9ICd1dGYtMTYtYmUnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmF3X2RlY29kZSA9IGNvZGVjcy51dGZfOF9kZWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gJ3V0Zi04JworICAgICAgICBzZWxmLnVwZGF0ZSgxKQorCisgICAgTk9OX1BSSU5UQUJMRSA9IHJlLmNvbXBpbGUoJ1teXHgwOVx4MEFceDBEXHgyMC1ceDdFXHg4NVx4QTAtXHVEN0ZGXHVFMDAwLVx1RkZGRF0nKQorICAgIGRlZiBjaGVja19wcmludGFibGUoc2VsZiwgZGF0YSk6CisgICAgICAgIG1hdGNoID0gc2VsZi5OT05fUFJJTlRBQkxFLnNlYXJjaChkYXRhKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IG1hdGNoLmdyb3VwKCkKKyAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5pbmRleCsobGVuKHNlbGYuYnVmZmVyKS1zZWxmLnBvaW50ZXIpK21hdGNoLnN0YXJ0KCkKKyAgICAgICAgICAgIHJhaXNlIFJlYWRlckVycm9yKHNlbGYubmFtZSwgcG9zaXRpb24sIG9yZChjaGFyYWN0ZXIpLAorICAgICAgICAgICAgICAgICAgICAndW5pY29kZScsICJzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkIikKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgaWYgc2VsZi5yYXdfYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltzZWxmLnBvaW50ZXI6XQorICAgICAgICBzZWxmLnBvaW50ZXIgPSAwCisgICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZmZlcikgPCBsZW5ndGg6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5lb2Y6CisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfcmF3KCkKKyAgICAgICAgICAgIGlmIHNlbGYucmF3X2RlY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEsIGNvbnZlcnRlZCA9IHNlbGYucmF3X2RlY29kZShzZWxmLnJhd19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmljdCcsIHNlbGYuZW9mKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJhd19idWZmZXJbZXhjLnN0YXJ0XQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5zdHJlYW1fcG9pbnRlci1sZW4oc2VsZi5yYXdfYnVmZmVyKStleGMuc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gZXhjLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRlckVycm9yKHNlbGYubmFtZSwgcG9zaXRpb24sIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZW5jb2RpbmcsIGV4Yy5yZWFzb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJhd19idWZmZXIKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBsZW4oZGF0YSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcHJpbnRhYmxlKGRhdGEpCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhCisgICAgICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBzZWxmLnJhd19idWZmZXJbY29udmVydGVkOl0KKyAgICAgICAgICAgIGlmIHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9ICdcMCcKKyAgICAgICAgICAgICAgICBzZWxmLnJhd19idWZmZXIgPSBOb25lCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiB1cGRhdGVfcmF3KHNlbGYsIHNpemU9NDA5Nik6CisgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKHNpemUpCisgICAgICAgIGlmIHNlbGYucmF3X2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yYXdfYnVmZmVyID0gZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yYXdfYnVmZmVyICs9IGRhdGEKKyAgICAgICAgc2VsZi5zdHJlYW1fcG9pbnRlciArPSBsZW4oZGF0YSkKKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICBzZWxmLmVvZiA9IFRydWUKKworI3RyeToKKyMgICAgaW1wb3J0IHBzeWNvCisjICAgIHBzeWNvLmJpbmQoUmVhZGVyKQorI2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyMgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvcmVwcmVzZW50ZXIucHkgYi9saWIzL3lhbWwvcmVwcmVzZW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjZDZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYjMveWFtbC9yZXByZXNlbnRlci5weQpAQCAtMCwwICsxLDM3NCBAQAorCitfX2FsbF9fID0gWydCYXNlUmVwcmVzZW50ZXInLCAnU2FmZVJlcHJlc2VudGVyJywgJ1JlcHJlc2VudGVyJywKKyAgICAnUmVwcmVzZW50ZXJFcnJvciddCisKK2Zyb20gLmVycm9yIGltcG9ydCAqCitmcm9tIC5ub2RlcyBpbXBvcnQgKgorCitpbXBvcnQgZGF0ZXRpbWUsIHN5cywgY29weXJlZywgdHlwZXMsIGJhc2U2NAorCitjbGFzcyBSZXByZXNlbnRlckVycm9yKFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBCYXNlUmVwcmVzZW50ZXI6CisKKyAgICB5YW1sX3JlcHJlc2VudGVycyA9IHt9CisgICAgeWFtbF9tdWx0aV9yZXByZXNlbnRlcnMgPSB7fQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRfc3R5bGU9Tm9uZSwgZGVmYXVsdF9mbG93X3N0eWxlPU5vbmUpOgorICAgICAgICBzZWxmLmRlZmF1bHRfc3R5bGUgPSBkZWZhdWx0X3N0eWxlCisgICAgICAgIHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlID0gZGVmYXVsdF9mbG93X3N0eWxlCisgICAgICAgIHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0cyA9IHt9CisgICAgICAgIHNlbGYub2JqZWN0X2tlZXBlciA9IFtdCisgICAgICAgIHNlbGYuYWxpYXNfa2V5ID0gTm9uZQorCisgICAgZGVmIHJlcHJlc2VudChzZWxmLCBkYXRhKToKKyAgICAgICAgbm9kZSA9IHNlbGYucmVwcmVzZW50X2RhdGEoZGF0YSkKKyAgICAgICAgc2VsZi5zZXJpYWxpemUobm9kZSkKKyAgICAgICAgc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzID0ge30KKyAgICAgICAgc2VsZi5vYmplY3Rfa2VlcGVyID0gW10KKyAgICAgICAgc2VsZi5hbGlhc19rZXkgPSBOb25lCisKKyAgICBkZWYgcmVwcmVzZW50X2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuaWdub3JlX2FsaWFzZXMoZGF0YSk6CisgICAgICAgICAgICBzZWxmLmFsaWFzX2tleSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWxpYXNfa2V5ID0gaWQoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5hbGlhc19rZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmFsaWFzX2tleSBpbiBzZWxmLnJlcHJlc2VudGVkX29iamVjdHM6CisgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0c1tzZWxmLmFsaWFzX2tleV0KKyAgICAgICAgICAgICAgICAjaWYgbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgICAgcmFpc2UgUmVwcmVzZW50ZXJFcnJvcigicmVjdXJzaXZlIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkOiAlciIgJSBkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgICAgICAgICAjc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzW2FsaWFzX2tleV0gPSBOb25lCisgICAgICAgICAgICBzZWxmLm9iamVjdF9rZWVwZXIuYXBwZW5kKGRhdGEpCisgICAgICAgIGRhdGFfdHlwZXMgPSB0eXBlKGRhdGEpLl9fbXJvX18KKyAgICAgICAgaWYgZGF0YV90eXBlc1swXSBpbiBzZWxmLnlhbWxfcmVwcmVzZW50ZXJzOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYueWFtbF9yZXByZXNlbnRlcnNbZGF0YV90eXBlc1swXV0oc2VsZiwgZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBkYXRhX3R5cGUgaW4gZGF0YV90eXBlczoKKyAgICAgICAgICAgICAgICBpZiBkYXRhX3R5cGUgaW4gc2VsZi55YW1sX211bHRpX3JlcHJlc2VudGVyczoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYueWFtbF9tdWx0aV9yZXByZXNlbnRlcnNbZGF0YV90eXBlXShzZWxmLCBkYXRhKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBOb25lIGluIHNlbGYueWFtbF9tdWx0aV9yZXByZXNlbnRlcnM6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnlhbWxfbXVsdGlfcmVwcmVzZW50ZXJzW05vbmVdKHNlbGYsIGRhdGEpCisgICAgICAgICAgICAgICAgZWxpZiBOb25lIGluIHNlbGYueWFtbF9yZXByZXNlbnRlcnM6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnlhbWxfcmVwcmVzZW50ZXJzW05vbmVdKHNlbGYsIGRhdGEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IFNjYWxhck5vZGUoTm9uZSwgc3RyKGRhdGEpKQorICAgICAgICAjaWYgYWxpYXNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAjICAgIHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0c1thbGlhc19rZXldID0gbm9kZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFkZF9yZXByZXNlbnRlcihjbHMsIGRhdGFfdHlwZSwgcmVwcmVzZW50ZXIpOgorICAgICAgICBpZiBub3QgJ3lhbWxfcmVwcmVzZW50ZXJzJyBpbiBjbHMuX19kaWN0X186CisgICAgICAgICAgICBjbHMueWFtbF9yZXByZXNlbnRlcnMgPSBjbHMueWFtbF9yZXByZXNlbnRlcnMuY29weSgpCisgICAgICAgIGNscy55YW1sX3JlcHJlc2VudGVyc1tkYXRhX3R5cGVdID0gcmVwcmVzZW50ZXIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhZGRfbXVsdGlfcmVwcmVzZW50ZXIoY2xzLCBkYXRhX3R5cGUsIHJlcHJlc2VudGVyKToKKyAgICAgICAgaWYgbm90ICd5YW1sX211bHRpX3JlcHJlc2VudGVycycgaW4gY2xzLl9fZGljdF9fOgorICAgICAgICAgICAgY2xzLnlhbWxfbXVsdGlfcmVwcmVzZW50ZXJzID0gY2xzLnlhbWxfbXVsdGlfcmVwcmVzZW50ZXJzLmNvcHkoKQorICAgICAgICBjbHMueWFtbF9tdWx0aV9yZXByZXNlbnRlcnNbZGF0YV90eXBlXSA9IHJlcHJlc2VudGVyCisKKyAgICBkZWYgcmVwcmVzZW50X3NjYWxhcihzZWxmLCB0YWcsIHZhbHVlLCBzdHlsZT1Ob25lKToKKyAgICAgICAgaWYgc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHN0eWxlID0gc2VsZi5kZWZhdWx0X3N0eWxlCisgICAgICAgIG5vZGUgPSBTY2FsYXJOb2RlKHRhZywgdmFsdWUsIHN0eWxlPXN0eWxlKQorICAgICAgICBpZiBzZWxmLmFsaWFzX2tleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVwcmVzZW50ZWRfb2JqZWN0c1tzZWxmLmFsaWFzX2tleV0gPSBub2RlCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgcmVwcmVzZW50X3NlcXVlbmNlKHNlbGYsIHRhZywgc2VxdWVuY2UsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgbm9kZSA9IFNlcXVlbmNlTm9kZSh0YWcsIHZhbHVlLCBmbG93X3N0eWxlPWZsb3dfc3R5bGUpCisgICAgICAgIGlmIHNlbGYuYWxpYXNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzW3NlbGYuYWxpYXNfa2V5XSA9IG5vZGUKKyAgICAgICAgYmVzdF9zdHlsZSA9IFRydWUKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VxdWVuY2U6CisgICAgICAgICAgICBub2RlX2l0ZW0gPSBzZWxmLnJlcHJlc2VudF9kYXRhKGl0ZW0pCisgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2Uobm9kZV9pdGVtLCBTY2FsYXJOb2RlKSBhbmQgbm90IG5vZGVfaXRlbS5zdHlsZSk6CisgICAgICAgICAgICAgICAgYmVzdF9zdHlsZSA9IEZhbHNlCisgICAgICAgICAgICB2YWx1ZS5hcHBlbmQobm9kZV9pdGVtKQorICAgICAgICBpZiBmbG93X3N0eWxlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZmxvd19zdHlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBub2RlLmZsb3dfc3R5bGUgPSBzZWxmLmRlZmF1bHRfZmxvd19zdHlsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub2RlLmZsb3dfc3R5bGUgPSBiZXN0X3N0eWxlCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgcmVwcmVzZW50X21hcHBpbmcoc2VsZiwgdGFnLCBtYXBwaW5nLCBmbG93X3N0eWxlPU5vbmUpOgorICAgICAgICB2YWx1ZSA9IFtdCisgICAgICAgIG5vZGUgPSBNYXBwaW5nTm9kZSh0YWcsIHZhbHVlLCBmbG93X3N0eWxlPWZsb3dfc3R5bGUpCisgICAgICAgIGlmIHNlbGYuYWxpYXNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXByZXNlbnRlZF9vYmplY3RzW3NlbGYuYWxpYXNfa2V5XSA9IG5vZGUKKyAgICAgICAgYmVzdF9zdHlsZSA9IFRydWUKKyAgICAgICAgaWYgaGFzYXR0cihtYXBwaW5nLCAnaXRlbXMnKToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBsaXN0KG1hcHBpbmcuaXRlbXMoKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtYXBwaW5nID0gc29ydGVkKG1hcHBpbmcpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGl0ZW1fa2V5LCBpdGVtX3ZhbHVlIGluIG1hcHBpbmc6CisgICAgICAgICAgICBub2RlX2tleSA9IHNlbGYucmVwcmVzZW50X2RhdGEoaXRlbV9rZXkpCisgICAgICAgICAgICBub2RlX3ZhbHVlID0gc2VsZi5yZXByZXNlbnRfZGF0YShpdGVtX3ZhbHVlKQorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKG5vZGVfa2V5LCBTY2FsYXJOb2RlKSBhbmQgbm90IG5vZGVfa2V5LnN0eWxlKToKKyAgICAgICAgICAgICAgICBiZXN0X3N0eWxlID0gRmFsc2UKKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShub2RlX3ZhbHVlLCBTY2FsYXJOb2RlKSBhbmQgbm90IG5vZGVfdmFsdWUuc3R5bGUpOgorICAgICAgICAgICAgICAgIGJlc3Rfc3R5bGUgPSBGYWxzZQorICAgICAgICAgICAgdmFsdWUuYXBwZW5kKChub2RlX2tleSwgbm9kZV92YWx1ZSkpCisgICAgICAgIGlmIGZsb3dfc3R5bGUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IHNlbGYuZGVmYXVsdF9mbG93X3N0eWxlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGUuZmxvd19zdHlsZSA9IGJlc3Rfc3R5bGUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBpZ25vcmVfYWxpYXNlcyhzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIFNhZmVSZXByZXNlbnRlcihCYXNlUmVwcmVzZW50ZXIpOgorCisgICAgZGVmIGlnbm9yZV9hbGlhc2VzKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBkYXRhIGluIFtOb25lLCAoKV06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIChzdHIsIGJ5dGVzLCBib29sLCBpbnQsIGZsb2F0KSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlcHJlc2VudF9ub25lKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywgJ251bGwnKQorCisgICAgZGVmIHJlcHJlc2VudF9zdHIoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIoJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X2JpbmFyeShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgaGFzYXR0cihiYXNlNjQsICdlbmNvZGVieXRlcycpOgorICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5lbmNvZGVieXRlcyhkYXRhKS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKGRhdGEpLmRlY29kZSgnYXNjaWknKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLCBkYXRhLCBzdHlsZT0nfCcpCisKKyAgICBkZWYgcmVwcmVzZW50X2Jvb2woc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICB2YWx1ZSA9ICd0cnVlJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSAnZmFsc2UnCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zY2FsYXIoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfaW50KHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCBzdHIoZGF0YSkpCisKKyAgICBpbmZfdmFsdWUgPSAxZTMwMAorICAgIHdoaWxlIHJlcHIoaW5mX3ZhbHVlKSAhPSByZXByKGluZl92YWx1ZSppbmZfdmFsdWUpOgorICAgICAgICBpbmZfdmFsdWUgKj0gaW5mX3ZhbHVlCisKKyAgICBkZWYgcmVwcmVzZW50X2Zsb2F0KHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBkYXRhICE9IGRhdGEgb3IgKGRhdGEgPT0gMC4wIGFuZCBkYXRhID09IDEuMCk6CisgICAgICAgICAgICB2YWx1ZSA9ICcubmFuJworICAgICAgICBlbGlmIGRhdGEgPT0gc2VsZi5pbmZfdmFsdWU6CisgICAgICAgICAgICB2YWx1ZSA9ICcuaW5mJworICAgICAgICBlbGlmIGRhdGEgPT0gLXNlbGYuaW5mX3ZhbHVlOgorICAgICAgICAgICAgdmFsdWUgPSAnLS5pbmYnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IHJlcHIoZGF0YSkubG93ZXIoKQorICAgICAgICAgICAgIyBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcyBgcmVwcihkYXRhKWAgcmVwcmVzZW50cyBhIGZsb2F0IG51bWJlcgorICAgICAgICAgICAgIyB3aXRob3V0IHRoZSBkZWNpbWFsIHBhcnRzLiAgRm9yIGluc3RhbmNlOgorICAgICAgICAgICAgIyAgID4+PiByZXByKDFlMTcpCisgICAgICAgICAgICAjICAgJzFlMTcnCisgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMgbm90IGEgdmFsaWQgZmxvYXQgcmVwcmVzZW50YXRpb24gYWNjb3JkaW5nCisgICAgICAgICAgICAjIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBgISFmbG9hdGAgdGFnLiAgV2UgZml4IHRoaXMgYnkgYWRkaW5nCisgICAgICAgICAgICAjICcuMCcgYmVmb3JlIHRoZSAnZScgc3ltYm9sLgorICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiB2YWx1ZSBhbmQgJ2UnIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnZScsICcuMGUnLCAxKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsIHZhbHVlKQorCisgICAgZGVmIHJlcHJlc2VudF9saXN0KHNlbGYsIGRhdGEpOgorICAgICAgICAjcGFpcnMgPSAobGVuKGRhdGEpID4gMCBhbmQgaXNpbnN0YW5jZShkYXRhLCBsaXN0KSkKKyAgICAgICAgI2lmIHBhaXJzOgorICAgICAgICAjICAgIGZvciBpdGVtIGluIGRhdGE6CisgICAgICAgICMgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIHR1cGxlKSBvciBsZW4oaXRlbSkgIT0gMjoKKyAgICAgICAgIyAgICAgICAgICAgIHBhaXJzID0gRmFsc2UKKyAgICAgICAgIyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICNpZiBub3QgcGFpcnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2VxdWVuY2UoJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScsIGRhdGEpCisgICAgICAgICN2YWx1ZSA9IFtdCisgICAgICAgICNmb3IgaXRlbV9rZXksIGl0ZW1fdmFsdWUgaW4gZGF0YToKKyAgICAgICAgIyAgICB2YWx1ZS5hcHBlbmQoc2VsZi5yZXByZXNlbnRfbWFwcGluZyh1J3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsCisgICAgICAgICMgICAgICAgIFsoaXRlbV9rZXksIGl0ZW1fdmFsdWUpXSkpCisgICAgICAgICNyZXR1cm4gU2VxdWVuY2VOb2RlKHUndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfZGljdChzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X21hcHBpbmcoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X3NldChzZWxmLCBkYXRhKToKKyAgICAgICAgdmFsdWUgPSB7fQorICAgICAgICBmb3Iga2V5IGluIGRhdGE6CisgICAgICAgICAgICB2YWx1ZVtrZXldID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfbWFwcGluZygndGFnOnlhbWwub3JnLDIwMDI6c2V0JywgdmFsdWUpCisKKyAgICBkZWYgcmVwcmVzZW50X2RhdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHZhbHVlID0gZGF0YS5pc29mb3JtYXQoKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfZGF0ZXRpbWUoc2VsZiwgZGF0YSk6CisgICAgICAgIHZhbHVlID0gZGF0YS5pc29mb3JtYXQoJyAnKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB2YWx1ZSkKKworICAgIGRlZiByZXByZXNlbnRfeWFtbF9vYmplY3Qoc2VsZiwgdGFnLCBkYXRhLCBjbHMsIGZsb3dfc3R5bGU9Tm9uZSk6CisgICAgICAgIGlmIGhhc2F0dHIoZGF0YSwgJ19fZ2V0c3RhdGVfXycpOgorICAgICAgICAgICAgc3RhdGUgPSBkYXRhLl9fZ2V0c3RhdGVfXygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0ZSA9IGRhdGEuX19kaWN0X18uY29weSgpCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9tYXBwaW5nKHRhZywgc3RhdGUsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKworICAgIGRlZiByZXByZXNlbnRfdW5kZWZpbmVkKHNlbGYsIGRhdGEpOgorICAgICAgICByYWlzZSBSZXByZXNlbnRlckVycm9yKCJjYW5ub3QgcmVwcmVzZW50IGFuIG9iamVjdDogJXMiICUgZGF0YSkKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcih0eXBlKE5vbmUpLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X25vbmUpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoc3RyLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X3N0cikKKworU2FmZVJlcHJlc2VudGVyLmFkZF9yZXByZXNlbnRlcihieXRlcywKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9iaW5hcnkpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoYm9vbCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9ib29sKQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGludCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9pbnQpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoZmxvYXQsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfZmxvYXQpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIobGlzdCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9saXN0KQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR1cGxlLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X2xpc3QpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoZGljdCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9kaWN0KQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHNldCwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9zZXQpCisKK1NhZmVSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIoZGF0ZXRpbWUuZGF0ZSwKKyAgICAgICAgU2FmZVJlcHJlc2VudGVyLnJlcHJlc2VudF9kYXRlKQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGRhdGV0aW1lLmRhdGV0aW1lLAorICAgICAgICBTYWZlUmVwcmVzZW50ZXIucmVwcmVzZW50X2RhdGV0aW1lKQorCitTYWZlUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKE5vbmUsCisgICAgICAgIFNhZmVSZXByZXNlbnRlci5yZXByZXNlbnRfdW5kZWZpbmVkKQorCitjbGFzcyBSZXByZXNlbnRlcihTYWZlUmVwcmVzZW50ZXIpOgorCisgICAgZGVmIHJlcHJlc2VudF9jb21wbGV4KHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBkYXRhLmltYWcgPT0gMC4wOgorICAgICAgICAgICAgZGF0YSA9ICclcicgJSBkYXRhLnJlYWwKKyAgICAgICAgZWxpZiBkYXRhLnJlYWwgPT0gMC4wOgorICAgICAgICAgICAgZGF0YSA9ICclcmonICUgZGF0YS5pbWFnCisgICAgICAgIGVsaWYgZGF0YS5pbWFnID4gMDoKKyAgICAgICAgICAgIGRhdGEgPSAnJXIrJXJqJyAlIChkYXRhLnJlYWwsIGRhdGEuaW1hZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSAnJXIlcmonICUgKGRhdGEucmVhbCwgZGF0YS5pbWFnKQorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKCd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vY29tcGxleCcsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X3R1cGxlKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2VxdWVuY2UoJ3RhZzp5YW1sLm9yZywyMDAyOnB5dGhvbi90dXBsZScsIGRhdGEpCisKKyAgICBkZWYgcmVwcmVzZW50X25hbWUoc2VsZiwgZGF0YSk6CisgICAgICAgIG5hbWUgPSAnJXMuJXMnICUgKGRhdGEuX19tb2R1bGVfXywgZGF0YS5fX25hbWVfXykKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X3NjYWxhcigndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL25hbWU6JytuYW1lLCAnJykKKworICAgIGRlZiByZXByZXNlbnRfbW9kdWxlKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByZXNlbnRfc2NhbGFyKAorICAgICAgICAgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vbW9kdWxlOicrZGF0YS5fX25hbWVfXywgJycpCisKKyAgICBkZWYgcmVwcmVzZW50X29iamVjdChzZWxmLCBkYXRhKToKKyAgICAgICAgIyBXZSB1c2UgX19yZWR1Y2VfXyBBUEkgdG8gc2F2ZSB0aGUgZGF0YS4gZGF0YS5fX3JlZHVjZV9fIHJldHVybnMKKyAgICAgICAgIyBhIHR1cGxlIG9mIGxlbmd0aCAyLTU6CisgICAgICAgICMgICAoZnVuY3Rpb24sIGFyZ3MsIHN0YXRlLCBsaXN0aXRlbXMsIGRpY3RpdGVtcykKKworICAgICAgICAjIEZvciByZWNvbnN0cnVjdGluZywgd2UgY2FsbHMgZnVuY3Rpb24oKmFyZ3MpLCB0aGVuIHNldCBpdHMgc3RhdGUsCisgICAgICAgICMgbGlzdGl0ZW1zLCBhbmQgZGljdGl0ZW1zIGlmIHRoZXkgYXJlIG5vdCBOb25lLgorCisgICAgICAgICMgQSBzcGVjaWFsIGNhc2UgaXMgd2hlbiBmdW5jdGlvbi5fX25hbWVfXyA9PSAnX19uZXdvYmpfXycuIEluIHRoaXMKKyAgICAgICAgIyBjYXNlIHdlIGNyZWF0ZSB0aGUgb2JqZWN0IHdpdGggYXJnc1swXS5fX25ld19fKCphcmdzKS4KKworICAgICAgICAjIEFub3RoZXIgc3BlY2lhbCBjYXNlIGlzIHdoZW4gX19yZWR1Y2VfXyByZXR1cm5zIGEgc3RyaW5nIC0gd2UgZG9uJ3QKKyAgICAgICAgIyBzdXBwb3J0IGl0LgorCisgICAgICAgICMgV2UgcHJvZHVjZSBhICEhcHl0aG9uL29iamVjdCwgISFweXRob24vb2JqZWN0L25ldyBvcgorICAgICAgICAjICEhcHl0aG9uL29iamVjdC9hcHBseSBub2RlLgorCisgICAgICAgIGNscyA9IHR5cGUoZGF0YSkKKyAgICAgICAgaWYgY2xzIGluIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGU6CisgICAgICAgICAgICByZWR1Y2UgPSBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlW2Nsc10oZGF0YSkKKyAgICAgICAgZWxpZiBoYXNhdHRyKGRhdGEsICdfX3JlZHVjZV9leF9fJyk6CisgICAgICAgICAgICByZWR1Y2UgPSBkYXRhLl9fcmVkdWNlX2V4X18oMikKKyAgICAgICAgZWxpZiBoYXNhdHRyKGRhdGEsICdfX3JlZHVjZV9fJyk6CisgICAgICAgICAgICByZWR1Y2UgPSBkYXRhLl9fcmVkdWNlX18oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUmVwcmVzZW50ZXJFcnJvcigiY2Fubm90IHJlcHJlc2VudCBvYmplY3Q6ICVyIiAlIGRhdGEpCisgICAgICAgIHJlZHVjZSA9IChsaXN0KHJlZHVjZSkrW05vbmVdKjUpWzo1XQorICAgICAgICBmdW5jdGlvbiwgYXJncywgc3RhdGUsIGxpc3RpdGVtcywgZGljdGl0ZW1zID0gcmVkdWNlCisgICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCisgICAgICAgIGlmIHN0YXRlIGlzIE5vbmU6CisgICAgICAgICAgICBzdGF0ZSA9IHt9CisgICAgICAgIGlmIGxpc3RpdGVtcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxpc3RpdGVtcyA9IGxpc3QobGlzdGl0ZW1zKQorICAgICAgICBpZiBkaWN0aXRlbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkaWN0aXRlbXMgPSBkaWN0KGRpY3RpdGVtcykKKyAgICAgICAgaWYgZnVuY3Rpb24uX19uYW1lX18gPT0gJ19fbmV3b2JqX18nOgorICAgICAgICAgICAgZnVuY3Rpb24gPSBhcmdzWzBdCisgICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAgICAgIHRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vb2JqZWN0L25ldzonCisgICAgICAgICAgICBuZXdvYmogPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6cHl0aG9uL29iamVjdC9hcHBseTonCisgICAgICAgICAgICBuZXdvYmogPSBGYWxzZQorICAgICAgICBmdW5jdGlvbl9uYW1lID0gJyVzLiVzJyAlIChmdW5jdGlvbi5fX21vZHVsZV9fLCBmdW5jdGlvbi5fX25hbWVfXykKKyAgICAgICAgaWYgbm90IGFyZ3MgYW5kIG5vdCBsaXN0aXRlbXMgYW5kIG5vdCBkaWN0aXRlbXMgXAorICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHN0YXRlLCBkaWN0KSBhbmQgbmV3b2JqOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVwcmVzZW50X21hcHBpbmcoCisgICAgICAgICAgICAgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpweXRob24vb2JqZWN0OicrZnVuY3Rpb25fbmFtZSwgc3RhdGUpCisgICAgICAgIGlmIG5vdCBsaXN0aXRlbXMgYW5kIG5vdCBkaWN0aXRlbXMgIFwKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzdGF0ZSwgZGljdCkgYW5kIG5vdCBzdGF0ZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9zZXF1ZW5jZSh0YWcrZnVuY3Rpb25fbmFtZSwgYXJncykKKyAgICAgICAgdmFsdWUgPSB7fQorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgdmFsdWVbJ2FyZ3MnXSA9IGFyZ3MKKyAgICAgICAgaWYgc3RhdGUgb3Igbm90IGlzaW5zdGFuY2Uoc3RhdGUsIGRpY3QpOgorICAgICAgICAgICAgdmFsdWVbJ3N0YXRlJ10gPSBzdGF0ZQorICAgICAgICBpZiBsaXN0aXRlbXM6CisgICAgICAgICAgICB2YWx1ZVsnbGlzdGl0ZW1zJ10gPSBsaXN0aXRlbXMKKyAgICAgICAgaWYgZGljdGl0ZW1zOgorICAgICAgICAgICAgdmFsdWVbJ2RpY3RpdGVtcyddID0gZGljdGl0ZW1zCisgICAgICAgIHJldHVybiBzZWxmLnJlcHJlc2VudF9tYXBwaW5nKHRhZytmdW5jdGlvbl9uYW1lLCB2YWx1ZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKGNvbXBsZXgsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9jb21wbGV4KQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodHVwbGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF90dXBsZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR5cGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9uYW1lKQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodHlwZXMuRnVuY3Rpb25UeXBlLAorICAgICAgICBSZXByZXNlbnRlci5yZXByZXNlbnRfbmFtZSkKKworUmVwcmVzZW50ZXIuYWRkX3JlcHJlc2VudGVyKHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUsCisgICAgICAgIFJlcHJlc2VudGVyLnJlcHJlc2VudF9uYW1lKQorCitSZXByZXNlbnRlci5hZGRfcmVwcmVzZW50ZXIodHlwZXMuTW9kdWxlVHlwZSwKKyAgICAgICAgUmVwcmVzZW50ZXIucmVwcmVzZW50X21vZHVsZSkKKworUmVwcmVzZW50ZXIuYWRkX211bHRpX3JlcHJlc2VudGVyKG9iamVjdCwKKyAgICAgICAgUmVwcmVzZW50ZXIucmVwcmVzZW50X29iamVjdCkKKwpkaWZmIC0tZ2l0IGEvbGliMy95YW1sL3Jlc29sdmVyLnB5IGIvbGliMy95YW1sL3Jlc29sdmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWNlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIzL3lhbWwvcmVzb2x2ZXIucHkKQEAgLTAsMCArMSwyMjQgQEAKKworX19hbGxfXyA9IFsnQmFzZVJlc29sdmVyJywgJ1Jlc29sdmVyJ10KKworZnJvbSAuZXJyb3IgaW1wb3J0ICoKK2Zyb20gLm5vZGVzIGltcG9ydCAqCisKK2ltcG9ydCByZQorCitjbGFzcyBSZXNvbHZlckVycm9yKFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBCYXNlUmVzb2x2ZXI6CisKKyAgICBERUZBVUxUX1NDQUxBUl9UQUcgPSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJworICAgIERFRkFVTFRfU0VRVUVOQ0VfVEFHID0gJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScKKyAgICBERUZBVUxUX01BUFBJTkdfVEFHID0gJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcKKworICAgIHlhbWxfaW1wbGljaXRfcmVzb2x2ZXJzID0ge30KKyAgICB5YW1sX3BhdGhfcmVzb2x2ZXJzID0ge30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXNvbHZlcl9leGFjdF9wYXRocyA9IFtdCisgICAgICAgIHNlbGYucmVzb2x2ZXJfcHJlZml4X3BhdGhzID0gW10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhZGRfaW1wbGljaXRfcmVzb2x2ZXIoY2xzLCB0YWcsIHJlZ2V4cCwgZmlyc3QpOgorICAgICAgICBpZiBub3QgJ3lhbWxfaW1wbGljaXRfcmVzb2x2ZXJzJyBpbiBjbHMuX19kaWN0X186CisgICAgICAgICAgICBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMgPSBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuY29weSgpCisgICAgICAgIGlmIGZpcnN0IGlzIE5vbmU6CisgICAgICAgICAgICBmaXJzdCA9IFtOb25lXQorICAgICAgICBmb3IgY2ggaW4gZmlyc3Q6CisgICAgICAgICAgICBjbHMueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuc2V0ZGVmYXVsdChjaCwgW10pLmFwcGVuZCgodGFnLCByZWdleHApKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFkZF9wYXRoX3Jlc29sdmVyKGNscywgdGFnLCBwYXRoLCBraW5kPU5vbmUpOgorICAgICAgICAjIE5vdGU6IGBhZGRfcGF0aF9yZXNvbHZlcmAgaXMgZXhwZXJpbWVudGFsLiAgVGhlIEFQSSBjb3VsZCBiZSBjaGFuZ2VkLgorICAgICAgICAjIGBuZXdfcGF0aGAgaXMgYSBwYXR0ZXJuIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBwYXRoIGZyb20gdGhlCisgICAgICAgICMgcm9vdCB0byB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGNvbnNpZGVyZWQuICBgbm9kZV9wYXRoYCBlbGVtZW50cyBhcmUKKyAgICAgICAgIyB0dXBsZXMgYChub2RlX2NoZWNrLCBpbmRleF9jaGVjaylgLiAgYG5vZGVfY2hlY2tgIGlzIGEgbm9kZSBjbGFzczoKKyAgICAgICAgIyBgU2NhbGFyTm9kZWAsIGBTZXF1ZW5jZU5vZGVgLCBgTWFwcGluZ05vZGVgIG9yIGBOb25lYC4gIGBOb25lYAorICAgICAgICAjIG1hdGNoZXMgYW55IGtpbmQgb2YgYSBub2RlLiAgYGluZGV4X2NoZWNrYCBjb3VsZCBiZSBgTm9uZWAsIGEgYm9vbGVhbgorICAgICAgICAjIHZhbHVlLCBhIHN0cmluZyB2YWx1ZSwgb3IgYSBudW1iZXIuICBgTm9uZWAgYW5kIGBGYWxzZWAgbWF0Y2ggYWdhaW5zdAorICAgICAgICAjIGFueSBfdmFsdWVfIG9mIHNlcXVlbmNlIGFuZCBtYXBwaW5nIG5vZGVzLiAgYFRydWVgIG1hdGNoZXMgYWdhaW5zdAorICAgICAgICAjIGFueSBfa2V5XyBvZiBhIG1hcHBpbmcgbm9kZS4gIEEgc3RyaW5nIGBpbmRleF9jaGVja2AgbWF0Y2hlcyBhZ2FpbnN0CisgICAgICAgICMgYSBtYXBwaW5nIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzY2FsYXIga2V5IHdoaWNoIGNvbnRlbnQgaXMKKyAgICAgICAgIyBlcXVhbCB0byB0aGUgYGluZGV4X2NoZWNrYCB2YWx1ZS4gIEFuIGludGVnZXIgYGluZGV4X2NoZWNrYCBtYXRjaGVzCisgICAgICAgICMgYWdhaW5zdCBhIHNlcXVlbmNlIHZhbHVlIHdpdGggdGhlIGluZGV4IGVxdWFsIHRvIGBpbmRleF9jaGVja2AuCisgICAgICAgIGlmIG5vdCAneWFtbF9wYXRoX3Jlc29sdmVycycgaW4gY2xzLl9fZGljdF9fOgorICAgICAgICAgICAgY2xzLnlhbWxfcGF0aF9yZXNvbHZlcnMgPSBjbHMueWFtbF9wYXRoX3Jlc29sdmVycy5jb3B5KCkKKyAgICAgICAgbmV3X3BhdGggPSBbXQorICAgICAgICBmb3IgZWxlbWVudCBpbiBwYXRoOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtZW50LCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICBpZiBsZW4oZWxlbWVudCkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgbm9kZV9jaGVjaywgaW5kZXhfY2hlY2sgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgZWxpZiBsZW4oZWxlbWVudCkgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgbm9kZV9jaGVjayA9IGVsZW1lbnRbMF0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXhfY2hlY2sgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVzb2x2ZXJFcnJvcigiSW52YWxpZCBwYXRoIGVsZW1lbnQ6ICVzIiAlIGVsZW1lbnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGVfY2hlY2sgPSBOb25lCisgICAgICAgICAgICAgICAgaW5kZXhfY2hlY2sgPSBlbGVtZW50CisgICAgICAgICAgICBpZiBub2RlX2NoZWNrIGlzIHN0cjoKKyAgICAgICAgICAgICAgICBub2RlX2NoZWNrID0gU2NhbGFyTm9kZQorICAgICAgICAgICAgZWxpZiBub2RlX2NoZWNrIGlzIGxpc3Q6CisgICAgICAgICAgICAgICAgbm9kZV9jaGVjayA9IFNlcXVlbmNlTm9kZQorICAgICAgICAgICAgZWxpZiBub2RlX2NoZWNrIGlzIGRpY3Q6CisgICAgICAgICAgICAgICAgbm9kZV9jaGVjayA9IE1hcHBpbmdOb2RlCisgICAgICAgICAgICBlbGlmIG5vZGVfY2hlY2sgbm90IGluIFtTY2FsYXJOb2RlLCBTZXF1ZW5jZU5vZGUsIE1hcHBpbmdOb2RlXSAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uobm9kZV9jaGVjaywgc3RyKSBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlX2NoZWNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlc29sdmVyRXJyb3IoIkludmFsaWQgbm9kZSBjaGVja2VyOiAlcyIgJSBub2RlX2NoZWNrKQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5kZXhfY2hlY2ssIChzdHIsIGludCkpICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBpbmRleF9jaGVjayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBSZXNvbHZlckVycm9yKCJJbnZhbGlkIGluZGV4IGNoZWNrZXI6ICVzIiAlIGluZGV4X2NoZWNrKQorICAgICAgICAgICAgbmV3X3BhdGguYXBwZW5kKChub2RlX2NoZWNrLCBpbmRleF9jaGVjaykpCisgICAgICAgIGlmIGtpbmQgaXMgc3RyOgorICAgICAgICAgICAga2luZCA9IFNjYWxhck5vZGUKKyAgICAgICAgZWxpZiBraW5kIGlzIGxpc3Q6CisgICAgICAgICAgICBraW5kID0gU2VxdWVuY2VOb2RlCisgICAgICAgIGVsaWYga2luZCBpcyBkaWN0OgorICAgICAgICAgICAga2luZCA9IE1hcHBpbmdOb2RlCisgICAgICAgIGVsaWYga2luZCBub3QgaW4gW1NjYWxhck5vZGUsIFNlcXVlbmNlTm9kZSwgTWFwcGluZ05vZGVdICAgIFwKKyAgICAgICAgICAgICAgICBhbmQga2luZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJlc29sdmVyRXJyb3IoIkludmFsaWQgbm9kZSBraW5kOiAlcyIgJSBraW5kKQorICAgICAgICBjbHMueWFtbF9wYXRoX3Jlc29sdmVyc1t0dXBsZShuZXdfcGF0aCksIGtpbmRdID0gdGFnCisKKyAgICBkZWYgZGVzY2VuZF9yZXNvbHZlcihzZWxmLCBjdXJyZW50X25vZGUsIGN1cnJlbnRfaW5kZXgpOgorICAgICAgICBpZiBub3Qgc2VsZi55YW1sX3BhdGhfcmVzb2x2ZXJzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4YWN0X3BhdGhzID0ge30KKyAgICAgICAgcHJlZml4X3BhdGhzID0gW10KKyAgICAgICAgaWYgY3VycmVudF9ub2RlOgorICAgICAgICAgICAgZGVwdGggPSBsZW4oc2VsZi5yZXNvbHZlcl9wcmVmaXhfcGF0aHMpCisgICAgICAgICAgICBmb3IgcGF0aCwga2luZCBpbiBzZWxmLnJlc29sdmVyX3ByZWZpeF9wYXRoc1stMV06CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja19yZXNvbHZlcl9wcmVmaXgoZGVwdGgsIHBhdGgsIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUsIGN1cnJlbnRfaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocGF0aCkgPiBkZXB0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9wYXRocy5hcHBlbmQoKHBhdGgsIGtpbmQpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3RfcGF0aHNba2luZF0gPSBzZWxmLnlhbWxfcGF0aF9yZXNvbHZlcnNbcGF0aCwga2luZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBwYXRoLCBraW5kIGluIHNlbGYueWFtbF9wYXRoX3Jlc29sdmVyczoKKyAgICAgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgZXhhY3RfcGF0aHNba2luZF0gPSBzZWxmLnlhbWxfcGF0aF9yZXNvbHZlcnNbcGF0aCwga2luZF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfcGF0aHMuYXBwZW5kKChwYXRoLCBraW5kKSkKKyAgICAgICAgc2VsZi5yZXNvbHZlcl9leGFjdF9wYXRocy5hcHBlbmQoZXhhY3RfcGF0aHMpCisgICAgICAgIHNlbGYucmVzb2x2ZXJfcHJlZml4X3BhdGhzLmFwcGVuZChwcmVmaXhfcGF0aHMpCisKKyAgICBkZWYgYXNjZW5kX3Jlc29sdmVyKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi55YW1sX3BhdGhfcmVzb2x2ZXJzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucmVzb2x2ZXJfZXhhY3RfcGF0aHMucG9wKCkKKyAgICAgICAgc2VsZi5yZXNvbHZlcl9wcmVmaXhfcGF0aHMucG9wKCkKKworICAgIGRlZiBjaGVja19yZXNvbHZlcl9wcmVmaXgoc2VsZiwgZGVwdGgsIHBhdGgsIGtpbmQsCisgICAgICAgICAgICBjdXJyZW50X25vZGUsIGN1cnJlbnRfaW5kZXgpOgorICAgICAgICBub2RlX2NoZWNrLCBpbmRleF9jaGVjayA9IHBhdGhbZGVwdGgtMV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlX2NoZWNrLCBzdHIpOgorICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLnRhZyAhPSBub2RlX2NoZWNrOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIG5vZGVfY2hlY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjdXJyZW50X25vZGUsIG5vZGVfY2hlY2spOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpbmRleF9jaGVjayBpcyBUcnVlIGFuZCBjdXJyZW50X2luZGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIChpbmRleF9jaGVjayBpcyBGYWxzZSBvciBpbmRleF9jaGVjayBpcyBOb25lKSAgICBcCisgICAgICAgICAgICAgICAgYW5kIGN1cnJlbnRfaW5kZXggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4X2NoZWNrLCBzdHIpOgorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGN1cnJlbnRfaW5kZXgsIFNjYWxhck5vZGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBpbmRleF9jaGVjayA9PSBjdXJyZW50X2luZGV4LnZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZGV4X2NoZWNrLCBpbnQpIGFuZCBub3QgaXNpbnN0YW5jZShpbmRleF9jaGVjaywgYm9vbCk6CisgICAgICAgICAgICBpZiBpbmRleF9jaGVjayAhPSBjdXJyZW50X2luZGV4OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlc29sdmUoc2VsZiwga2luZCwgdmFsdWUsIGltcGxpY2l0KToKKyAgICAgICAgaWYga2luZCBpcyBTY2FsYXJOb2RlIGFuZCBpbXBsaWNpdFswXToKKyAgICAgICAgICAgIGlmIHZhbHVlID09ICcnOgorICAgICAgICAgICAgICAgIHJlc29sdmVycyA9IHNlbGYueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuZ2V0KCcnLCBbXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzb2x2ZXJzID0gc2VsZi55YW1sX2ltcGxpY2l0X3Jlc29sdmVycy5nZXQodmFsdWVbMF0sIFtdKQorICAgICAgICAgICAgcmVzb2x2ZXJzICs9IHNlbGYueWFtbF9pbXBsaWNpdF9yZXNvbHZlcnMuZ2V0KE5vbmUsIFtdKQorICAgICAgICAgICAgZm9yIHRhZywgcmVnZXhwIGluIHJlc29sdmVyczoKKyAgICAgICAgICAgICAgICBpZiByZWdleHAubWF0Y2godmFsdWUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnCisgICAgICAgICAgICBpbXBsaWNpdCA9IGltcGxpY2l0WzFdCisgICAgICAgIGlmIHNlbGYueWFtbF9wYXRoX3Jlc29sdmVyczoKKyAgICAgICAgICAgIGV4YWN0X3BhdGhzID0gc2VsZi5yZXNvbHZlcl9leGFjdF9wYXRoc1stMV0KKyAgICAgICAgICAgIGlmIGtpbmQgaW4gZXhhY3RfcGF0aHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4YWN0X3BhdGhzW2tpbmRdCisgICAgICAgICAgICBpZiBOb25lIGluIGV4YWN0X3BhdGhzOgorICAgICAgICAgICAgICAgIHJldHVybiBleGFjdF9wYXRoc1tOb25lXQorICAgICAgICBpZiBraW5kIGlzIFNjYWxhck5vZGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ERUZBVUxUX1NDQUxBUl9UQUcKKyAgICAgICAgZWxpZiBraW5kIGlzIFNlcXVlbmNlTm9kZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkRFRkFVTFRfU0VRVUVOQ0VfVEFHCisgICAgICAgIGVsaWYga2luZCBpcyBNYXBwaW5nTm9kZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkRFRkFVTFRfTUFQUElOR19UQUcKKworY2xhc3MgUmVzb2x2ZXIoQmFzZVJlc29sdmVyKToKKyAgICBwYXNzCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLAorICAgICAgICByZS5jb21waWxlKHInJydeKD86eWVzfFllc3xZRVN8bm98Tm98Tk8KKyAgICAgICAgICAgICAgICAgICAgfHRydWV8VHJ1ZXxUUlVFfGZhbHNlfEZhbHNlfEZBTFNFCisgICAgICAgICAgICAgICAgICAgIHxvbnxPbnxPTnxvZmZ8T2ZmfE9GRikkJycnLCByZS5YKSwKKyAgICAgICAgbGlzdCgneVluTnRUZkZvTycpKQorCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsCisgICAgICAgIHJlLmNvbXBpbGUocicnJ14oPzpbLStdPyg/OlswLTldWzAtOV9dKilcLlswLTlfXSooPzpbZUVdWy0rXVswLTldKyk/CisgICAgICAgICAgICAgICAgICAgIHxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/CisgICAgICAgICAgICAgICAgICAgIHxbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXC5bMC05X10qCisgICAgICAgICAgICAgICAgICAgIHxbLStdP1wuKD86aW5mfEluZnxJTkYpCisgICAgICAgICAgICAgICAgICAgIHxcLig/Om5hbnxOYU58TkFOKSkkJycnLCByZS5YKSwKKyAgICAgICAgbGlzdCgnLSswMTIzNDU2Nzg5LicpKQorCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLAorICAgICAgICByZS5jb21waWxlKHInJydeKD86Wy0rXT8wYlswLTFfXSsKKyAgICAgICAgICAgICAgICAgICAgfFstK10/MFswLTdfXSsKKyAgICAgICAgICAgICAgICAgICAgfFstK10/KD86MHxbMS05XVswLTlfXSopCisgICAgICAgICAgICAgICAgICAgIHxbLStdPzB4WzAtOWEtZkEtRl9dKworICAgICAgICAgICAgICAgICAgICB8Wy0rXT9bMS05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pKykkJycnLCByZS5YKSwKKyAgICAgICAgbGlzdCgnLSswMTIzNDU2Nzg5JykpCisKK1Jlc29sdmVyLmFkZF9pbXBsaWNpdF9yZXNvbHZlcigKKyAgICAgICAgJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJywKKyAgICAgICAgcmUuY29tcGlsZShyJ14oPzo8PCkkJyksCisgICAgICAgIFsnPCddKQorCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywKKyAgICAgICAgcmUuY29tcGlsZShyJycnXig/OiB+CisgICAgICAgICAgICAgICAgICAgIHxudWxsfE51bGx8TlVMTAorICAgICAgICAgICAgICAgICAgICB8ICkkJycnLCByZS5YKSwKKyAgICAgICAgWyd+JywgJ24nLCAnTicsICcnXSkKKworUmVzb2x2ZXIuYWRkX2ltcGxpY2l0X3Jlc29sdmVyKAorICAgICAgICAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywKKyAgICAgICAgcmUuY29tcGlsZShyJycnXig/OlswLTldWzAtOV1bMC05XVswLTldLVswLTldWzAtOV0tWzAtOV1bMC05XQorICAgICAgICAgICAgICAgICAgICB8WzAtOV1bMC05XVswLTldWzAtOV0gLVswLTldWzAtOV0/IC1bMC05XVswLTldPworICAgICAgICAgICAgICAgICAgICAgKD86W1R0XXxbIFx0XSspWzAtOV1bMC05XT8KKyAgICAgICAgICAgICAgICAgICAgIDpbMC05XVswLTldIDpbMC05XVswLTldICg/OlwuWzAtOV0qKT8KKyAgICAgICAgICAgICAgICAgICAgICg/OlsgXHRdKig/Olp8Wy0rXVswLTldWzAtOV0/KD86OlswLTldWzAtOV0pPykpPykkJycnLCByZS5YKSwKKyAgICAgICAgbGlzdCgnMDEyMzQ1Njc4OScpKQorCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjp2YWx1ZScsCisgICAgICAgIHJlLmNvbXBpbGUocideKD86PSkkJyksCisgICAgICAgIFsnPSddKQorCisjIFRoZSBmb2xsb3dpbmcgcmVzb2x2ZXIgaXMgb25seSBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4gSXQgY2Fubm90IHdvcmsKKyMgYmVjYXVzZSBwbGFpbiBzY2FsYXJzIGNhbm5vdCBzdGFydCB3aXRoICchJywgJyYnLCBvciAnKicuCitSZXNvbHZlci5hZGRfaW1wbGljaXRfcmVzb2x2ZXIoCisgICAgICAgICd0YWc6eWFtbC5vcmcsMjAwMjp5YW1sJywKKyAgICAgICAgcmUuY29tcGlsZShyJ14oPzohfCZ8XCopJCcpLAorICAgICAgICBsaXN0KCchJionKSkKKwpkaWZmIC0tZ2l0IGEvbGliMy95YW1sL3NjYW5uZXIucHkgYi9saWIzL3lhbWwvc2Nhbm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQxMjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliMy95YW1sL3NjYW5uZXIucHkKQEAgLTAsMCArMSwxNDQ0IEBACisKKyMgU2Nhbm5lciBwcm9kdWNlcyB0b2tlbnMgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKyMgU1RSRUFNLVNUQVJUCisjIFNUUkVBTS1FTkQKKyMgRElSRUNUSVZFKG5hbWUsIHZhbHVlKQorIyBET0NVTUVOVC1TVEFSVAorIyBET0NVTUVOVC1FTkQKKyMgQkxPQ0stU0VRVUVOQ0UtU1RBUlQKKyMgQkxPQ0stTUFQUElORy1TVEFSVAorIyBCTE9DSy1FTkQKKyMgRkxPVy1TRVFVRU5DRS1TVEFSVAorIyBGTE9XLU1BUFBJTkctU1RBUlQKKyMgRkxPVy1TRVFVRU5DRS1FTkQKKyMgRkxPVy1NQVBQSU5HLUVORAorIyBCTE9DSy1FTlRSWQorIyBGTE9XLUVOVFJZCisjIEtFWQorIyBWQUxVRQorIyBBTElBUyh2YWx1ZSkKKyMgQU5DSE9SKHZhbHVlKQorIyBUQUcodmFsdWUpCisjIFNDQUxBUih2YWx1ZSwgcGxhaW4sIHN0eWxlKQorIworIyBSZWFkIGNvbW1lbnRzIGluIHRoZSBTY2FubmVyIGNvZGUgZm9yIG1vcmUgZGV0YWlscy4KKyMKKworX19hbGxfXyA9IFsnU2Nhbm5lcicsICdTY2FubmVyRXJyb3InXQorCitmcm9tIC5lcnJvciBpbXBvcnQgTWFya2VkWUFNTEVycm9yCitmcm9tIC50b2tlbnMgaW1wb3J0ICoKKworY2xhc3MgU2Nhbm5lckVycm9yKE1hcmtlZFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBTaW1wbGVLZXk6CisgICAgIyBTZWUgYmVsb3cgc2ltcGxlIGtleXMgdHJlYXRtZW50LgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuX251bWJlciwgcmVxdWlyZWQsIGluZGV4LCBsaW5lLCBjb2x1bW4sIG1hcmspOgorICAgICAgICBzZWxmLnRva2VuX251bWJlciA9IHRva2VuX251bWJlcgorICAgICAgICBzZWxmLnJlcXVpcmVkID0gcmVxdWlyZWQKKyAgICAgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKyAgICAgICAgc2VsZi5jb2x1bW4gPSBjb2x1bW4KKyAgICAgICAgc2VsZi5tYXJrID0gbWFyaworCitjbGFzcyBTY2FubmVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplIHRoZSBzY2FubmVyLiIiIgorICAgICAgICAjIEl0IGlzIGFzc3VtZWQgdGhhdCBTY2FubmVyIGFuZCBSZWFkZXIgd2lsbCBoYXZlIGEgY29tbW9uIGRlc2NlbmRhbnQuCisgICAgICAgICMgUmVhZGVyIGRvIHRoZSBkaXJ0eSB3b3JrIG9mIGNoZWNraW5nIGZvciBCT00gYW5kIGNvbnZlcnRpbmcgdGhlCisgICAgICAgICMgaW5wdXQgZGF0YSB0byBVbmljb2RlLiBJdCBhbHNvIGFkZHMgTlVMIHRvIHRoZSBlbmQuCisgICAgICAgICMKKyAgICAgICAgIyBSZWFkZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtZXRob2RzCisgICAgICAgICMgICBzZWxmLnBlZWsoaT0wKSAgICAgICAjIHBlZWsgdGhlIG5leHQgaS10aCBjaGFyYWN0ZXIKKyAgICAgICAgIyAgIHNlbGYucHJlZml4KGw9MSkgICAgICMgcGVlayB0aGUgbmV4dCBsIGNoYXJhY3RlcnMKKyAgICAgICAgIyAgIHNlbGYuZm9yd2FyZChsPTEpICAgICMgcmVhZCB0aGUgbmV4dCBsIGNoYXJhY3RlcnMgYW5kIG1vdmUgdGhlIHBvaW50ZXIuCisKKyAgICAgICAgIyBIYWQgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0/CisgICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCisKKyAgICAgICAgIyBUaGUgbnVtYmVyIG9mIHVuY2xvc2VkICd7JyBhbmQgJ1snLiBgZmxvd19sZXZlbCA9PSAwYCBtZWFucyBibG9jaworICAgICAgICAjIGNvbnRleHQuCisgICAgICAgIHNlbGYuZmxvd19sZXZlbCA9IDAKKworICAgICAgICAjIExpc3Qgb2YgcHJvY2Vzc2VkIHRva2VucyB0aGF0IGFyZSBub3QgeWV0IGVtaXR0ZWQuCisgICAgICAgIHNlbGYudG9rZW5zID0gW10KKworICAgICAgICAjIEFkZCB0aGUgU1RSRUFNLVNUQVJUIHRva2VuLgorICAgICAgICBzZWxmLmZldGNoX3N0cmVhbV9zdGFydCgpCisKKyAgICAgICAgIyBOdW1iZXIgb2YgdG9rZW5zIHRoYXQgd2VyZSBlbWl0dGVkIHRocm91Z2ggdGhlIGBnZXRfdG9rZW5gIG1ldGhvZC4KKyAgICAgICAgc2VsZi50b2tlbnNfdGFrZW4gPSAwCisKKyAgICAgICAgIyBUaGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICAgICAgc2VsZi5pbmRlbnQgPSAtMQorCisgICAgICAgICMgUGFzdCBpbmRlbnRhdGlvbiBsZXZlbHMuCisgICAgICAgIHNlbGYuaW5kZW50cyA9IFtdCisKKyAgICAgICAgIyBWYXJpYWJsZXMgcmVsYXRlZCB0byBzaW1wbGUga2V5cyB0cmVhdG1lbnQuCisKKyAgICAgICAgIyBBIHNpbXBsZSBrZXkgaXMgYSBrZXkgdGhhdCBpcyBub3QgZGVub3RlZCBieSB0aGUgJz8nIGluZGljYXRvci4KKyAgICAgICAgIyBFeGFtcGxlIG9mIHNpbXBsZSBrZXlzOgorICAgICAgICAjICAgLS0tCisgICAgICAgICMgICBibG9jayBzaW1wbGUga2V5OiB2YWx1ZQorICAgICAgICAjICAgPyBub3QgYSBzaW1wbGUga2V5OgorICAgICAgICAjICAgOiB7IGZsb3cgc2ltcGxlIGtleTogdmFsdWUgfQorICAgICAgICAjIFdlIGVtaXQgdGhlIEtFWSB0b2tlbiBiZWZvcmUgYWxsIGtleXMsIHNvIHdoZW4gd2UgZmluZCBhIHBvdGVudGlhbAorICAgICAgICAjIHNpbXBsZSBrZXksIHdlIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgJzonIGluZGljYXRvci4KKyAgICAgICAgIyBTaW1wbGUga2V5cyBzaG91bGQgYmUgbGltaXRlZCB0byBhIHNpbmdsZSBsaW5lIGFuZCAxMDI0IGNoYXJhY3RlcnMuCisKKyAgICAgICAgIyBDYW4gYSBzaW1wbGUga2V5IHN0YXJ0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uPyBBIHNpbXBsZSBrZXkgbWF5CisgICAgICAgICMgc3RhcnQ6CisgICAgICAgICMgLSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCBub3QgY291bnRpbmcgaW5kZW50YXRpb24gc3BhY2VzCisgICAgICAgICMgICAgICAgKGluIGJsb2NrIGNvbnRleHQpLAorICAgICAgICAjIC0gYWZ0ZXIgJ3snLCAnWycsICcsJyAoaW4gdGhlIGZsb3cgY29udGV4dCksCisgICAgICAgICMgLSBhZnRlciAnPycsICc6JywgJy0nIChpbiB0aGUgYmxvY2sgY29udGV4dCkuCisgICAgICAgICMgSW4gdGhlIGJsb2NrIGNvbnRleHQsIHRoaXMgZmxhZyBhbHNvIHNpZ25pZmllcyBpZiBhIGJsb2NrIGNvbGxlY3Rpb24KKyAgICAgICAgIyBtYXkgc3RhcnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IFRydWUKKworICAgICAgICAjIEtlZXAgdHJhY2sgb2YgcG9zc2libGUgc2ltcGxlIGtleXMuIFRoaXMgaXMgYSBkaWN0aW9uYXJ5LiBUaGUga2V5CisgICAgICAgICMgaXMgYGZsb3dfbGV2ZWxgOyB0aGVyZSBjYW4gYmUgbm8gbW9yZSB0aGF0IG9uZSBwb3NzaWJsZSBzaW1wbGUga2V5CisgICAgICAgICMgZm9yIGVhY2ggbGV2ZWwuIFRoZSB2YWx1ZSBpcyBhIFNpbXBsZUtleSByZWNvcmQ6CisgICAgICAgICMgICAodG9rZW5fbnVtYmVyLCByZXF1aXJlZCwgaW5kZXgsIGxpbmUsIGNvbHVtbiwgbWFyaykKKyAgICAgICAgIyBBIHNpbXBsZSBrZXkgbWF5IHN0YXJ0IHdpdGggQUxJQVMsIEFOQ0hPUiwgVEFHLCBTQ0FMQVIoZmxvdyksCisgICAgICAgICMgJ1snLCBvciAneycgdG9rZW5zLgorICAgICAgICBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzID0ge30KKworICAgICMgUHVibGljIG1ldGhvZHMuCisKKyAgICBkZWYgY2hlY2tfdG9rZW4oc2VsZiwgKmNob2ljZXMpOgorICAgICAgICAjIENoZWNrIGlmIHRoZSBuZXh0IHRva2VuIGlzIG9uZSBvZiB0aGUgZ2l2ZW4gdHlwZXMuCisgICAgICAgIHdoaWxlIHNlbGYubmVlZF9tb3JlX3Rva2VucygpOgorICAgICAgICAgICAgc2VsZi5mZXRjaF9tb3JlX3Rva2VucygpCisgICAgICAgIGlmIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgaWYgbm90IGNob2ljZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZvciBjaG9pY2UgaW4gY2hvaWNlczoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudG9rZW5zWzBdLCBjaG9pY2UpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBwZWVrX3Rva2VuKHNlbGYpOgorICAgICAgICAjIFJldHVybiB0aGUgbmV4dCB0b2tlbiwgYnV0IGRvIG5vdCBkZWxldGUgaWYgZnJvbSB0aGUgcXVldWUuCisgICAgICAgIHdoaWxlIHNlbGYubmVlZF9tb3JlX3Rva2VucygpOgorICAgICAgICAgICAgc2VsZi5mZXRjaF9tb3JlX3Rva2VucygpCisgICAgICAgIGlmIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zWzBdCisKKyAgICBkZWYgZ2V0X3Rva2VuKHNlbGYpOgorICAgICAgICAjIFJldHVybiB0aGUgbmV4dCB0b2tlbi4KKyAgICAgICAgd2hpbGUgc2VsZi5uZWVkX21vcmVfdG9rZW5zKCk6CisgICAgICAgICAgICBzZWxmLmZldGNoX21vcmVfdG9rZW5zKCkKKyAgICAgICAgaWYgc2VsZi50b2tlbnM6CisgICAgICAgICAgICBzZWxmLnRva2Vuc190YWtlbiArPSAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbnMucG9wKDApCisKKyAgICAjIFByaXZhdGUgbWV0aG9kcy4KKworICAgIGRlZiBuZWVkX21vcmVfdG9rZW5zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRvbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbm90IHNlbGYudG9rZW5zOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBUaGUgY3VycmVudCB0b2tlbiBtYXkgYmUgYSBwb3RlbnRpYWwgc2ltcGxlIGtleSwgc28gd2UKKyAgICAgICAgIyBuZWVkIHRvIGxvb2sgZnVydGhlci4KKyAgICAgICAgc2VsZi5zdGFsZV9wb3NzaWJsZV9zaW1wbGVfa2V5cygpCisgICAgICAgIGlmIHNlbGYubmV4dF9wb3NzaWJsZV9zaW1wbGVfa2V5KCkgPT0gc2VsZi50b2tlbnNfdGFrZW46CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGZldGNoX21vcmVfdG9rZW5zKHNlbGYpOgorCisgICAgICAgICMgRWF0IHdoaXRlc3BhY2VzIGFuZCBjb21tZW50cyB1bnRpbCB3ZSByZWFjaCB0aGUgbmV4dCB0b2tlbi4KKyAgICAgICAgc2VsZi5zY2FuX3RvX25leHRfdG9rZW4oKQorCisgICAgICAgICMgUmVtb3ZlIG9ic29sZXRlIHBvc3NpYmxlIHNpbXBsZSBrZXlzLgorICAgICAgICBzZWxmLnN0YWxlX3Bvc3NpYmxlX3NpbXBsZV9rZXlzKCkKKworICAgICAgICAjIENvbXBhcmUgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYW5kIGNvbHVtbi4gSXQgbWF5IGFkZCBzb21lIHRva2VucworICAgICAgICAjIGFuZCBkZWNyZWFzZSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICAgICAgc2VsZi51bndpbmRfaW5kZW50KHNlbGYuY29sdW1uKQorCisgICAgICAgICMgUGVlayB0aGUgbmV4dCBjaGFyYWN0ZXIuCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKworICAgICAgICAjIElzIGl0IHRoZSBlbmQgb2Ygc3RyZWFtPworICAgICAgICBpZiBjaCA9PSAnXDAnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfc3RyZWFtX2VuZCgpCisKKyAgICAgICAgIyBJcyBpdCBhIGRpcmVjdGl2ZT8KKyAgICAgICAgaWYgY2ggPT0gJyUnIGFuZCBzZWxmLmNoZWNrX2RpcmVjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZGlyZWN0aXZlKCkKKworICAgICAgICAjIElzIGl0IHRoZSBkb2N1bWVudCBzdGFydD8KKyAgICAgICAgaWYgY2ggPT0gJy0nIGFuZCBzZWxmLmNoZWNrX2RvY3VtZW50X3N0YXJ0KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9kb2N1bWVudF9zdGFydCgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgZG9jdW1lbnQgZW5kPworICAgICAgICBpZiBjaCA9PSAnLicgYW5kIHNlbGYuY2hlY2tfZG9jdW1lbnRfZW5kKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9kb2N1bWVudF9lbmQoKQorCisgICAgICAgICMgVE9ETzogc3VwcG9ydCBmb3IgQk9NIHdpdGhpbiBhIHN0cmVhbS4KKyAgICAgICAgI2lmIGNoID09ICdcdUZFRkYnOgorICAgICAgICAjICAgIHJldHVybiBzZWxmLmZldGNoX2JvbSgpICAgIDwtLSBpc3N1ZSBCT01Ub2tlbgorCisgICAgICAgICMgTm90ZTogdGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgY2hlY2tzIGlzIE5PVCBzaWduaWZpY2FudC4KKworICAgICAgICAjIElzIGl0IHRoZSBmbG93IHNlcXVlbmNlIHN0YXJ0IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gJ1snOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZmxvd19zZXF1ZW5jZV9zdGFydCgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgZmxvdyBtYXBwaW5nIHN0YXJ0IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gJ3snOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZmxvd19tYXBwaW5nX3N0YXJ0KCkKKworICAgICAgICAjIElzIGl0IHRoZSBmbG93IHNlcXVlbmNlIGVuZCBpbmRpY2F0b3I/CisgICAgICAgIGlmIGNoID09ICddJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2Zsb3dfc2VxdWVuY2VfZW5kKCkKKworICAgICAgICAjIElzIGl0IHRoZSBmbG93IG1hcHBpbmcgZW5kIGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gJ30nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfZmxvd19tYXBwaW5nX2VuZCgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUgZmxvdyBlbnRyeSBpbmRpY2F0b3I/CisgICAgICAgIGlmIGNoID09ICcsJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2Zsb3dfZW50cnkoKQorCisgICAgICAgICMgSXMgaXQgdGhlIGJsb2NrIGVudHJ5IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gJy0nIGFuZCBzZWxmLmNoZWNrX2Jsb2NrX2VudHJ5KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9ibG9ja19lbnRyeSgpCisKKyAgICAgICAgIyBJcyBpdCB0aGUga2V5IGluZGljYXRvcj8KKyAgICAgICAgaWYgY2ggPT0gJz8nIGFuZCBzZWxmLmNoZWNrX2tleSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfa2V5KCkKKworICAgICAgICAjIElzIGl0IHRoZSB2YWx1ZSBpbmRpY2F0b3I/CisgICAgICAgIGlmIGNoID09ICc6JyBhbmQgc2VsZi5jaGVja192YWx1ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfdmFsdWUoKQorCisgICAgICAgICMgSXMgaXQgYW4gYWxpYXM/CisgICAgICAgIGlmIGNoID09ICcqJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2FsaWFzKCkKKworICAgICAgICAjIElzIGl0IGFuIGFuY2hvcj8KKyAgICAgICAgaWYgY2ggPT0gJyYnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfYW5jaG9yKCkKKworICAgICAgICAjIElzIGl0IGEgdGFnPworICAgICAgICBpZiBjaCA9PSAnISc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF90YWcoKQorCisgICAgICAgICMgSXMgaXQgYSBsaXRlcmFsIHNjYWxhcj8KKyAgICAgICAgaWYgY2ggPT0gJ3wnIGFuZCBub3Qgc2VsZi5mbG93X2xldmVsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfbGl0ZXJhbCgpCisKKyAgICAgICAgIyBJcyBpdCBhIGZvbGRlZCBzY2FsYXI/CisgICAgICAgIGlmIGNoID09ICc+JyBhbmQgbm90IHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoX2ZvbGRlZCgpCisKKyAgICAgICAgIyBJcyBpdCBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyPworICAgICAgICBpZiBjaCA9PSAnXCcnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmV0Y2hfc2luZ2xlKCkKKworICAgICAgICAjIElzIGl0IGEgZG91YmxlIHF1b3RlZCBzY2FsYXI/CisgICAgICAgIGlmIGNoID09ICdcIic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9kb3VibGUoKQorCisgICAgICAgICMgSXQgbXVzdCBiZSBhIHBsYWluIHNjYWxhciB0aGVuLgorICAgICAgICBpZiBzZWxmLmNoZWNrX3BsYWluKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaF9wbGFpbigpCisKKyAgICAgICAgIyBObz8gSXQncyBhbiBlcnJvci4gTGV0J3MgcHJvZHVjZSBhIG5pY2UgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBmb3IgdGhlIG5leHQgdG9rZW4iLCBOb25lLAorICAgICAgICAgICAgICAgICJmb3VuZCBjaGFyYWN0ZXIgJXIgdGhhdCBjYW5ub3Qgc3RhcnQgYW55IHRva2VuIiAlIGNoLAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKworICAgICMgU2ltcGxlIGtleXMgdHJlYXRtZW50LgorCisgICAgZGVmIG5leHRfcG9zc2libGVfc2ltcGxlX2tleShzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgbmVhcmVzdCBwb3NzaWJsZSBzaW1wbGUga2V5LiBBY3R1YWxseSB3ZQorICAgICAgICAjIGRvbid0IG5lZWQgdG8gbG9vcCB0aHJvdWdoIHRoZSB3aG9sZSBkaWN0aW9uYXJ5LiBXZSBtYXkgcmVwbGFjZSBpdAorICAgICAgICAjIHdpdGggdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAgICAjICAgaWYgbm90IHNlbGYucG9zc2libGVfc2ltcGxlX2tleXM6CisgICAgICAgICMgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyAgIHJldHVybiBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzWworICAgICAgICAjICAgICAgICAgICBtaW4oc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5cy5rZXlzKCkpXS50b2tlbl9udW1iZXIKKyAgICAgICAgbWluX3Rva2VuX251bWJlciA9IE5vbmUKKyAgICAgICAgZm9yIGxldmVsIGluIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXM6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW2xldmVsXQorICAgICAgICAgICAgaWYgbWluX3Rva2VuX251bWJlciBpcyBOb25lIG9yIGtleS50b2tlbl9udW1iZXIgPCBtaW5fdG9rZW5fbnVtYmVyOgorICAgICAgICAgICAgICAgIG1pbl90b2tlbl9udW1iZXIgPSBrZXkudG9rZW5fbnVtYmVyCisgICAgICAgIHJldHVybiBtaW5fdG9rZW5fbnVtYmVyCisKKyAgICBkZWYgc3RhbGVfcG9zc2libGVfc2ltcGxlX2tleXMoc2VsZik6CisgICAgICAgICMgUmVtb3ZlIGVudHJpZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHBvc3NpYmxlIHNpbXBsZSBrZXlzLiBBY2NvcmRpbmcgdG8KKyAgICAgICAgIyB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLCBzaW1wbGUga2V5cworICAgICAgICAjIC0gc2hvdWxkIGJlIGxpbWl0ZWQgdG8gYSBzaW5nbGUgbGluZSwKKyAgICAgICAgIyAtIHNob3VsZCBiZSBubyBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuCisgICAgICAgICMgRGlzYWJsaW5nIHRoaXMgcHJvY2VkdXJlIHdpbGwgYWxsb3cgc2ltcGxlIGtleXMgb2YgYW55IGxlbmd0aCBhbmQKKyAgICAgICAgIyBoZWlnaHQgKG1heSBjYXVzZSBwcm9ibGVtcyBpZiBpbmRlbnRhdGlvbiBpcyBicm9rZW4gdGhvdWdoKS4KKyAgICAgICAgZm9yIGxldmVsIGluIGxpc3Qoc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5cyk6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW2xldmVsXQorICAgICAgICAgICAgaWYga2V5LmxpbmUgIT0gc2VsZi5saW5lICBcCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuaW5kZXgta2V5LmluZGV4ID4gMTAyNDoKKyAgICAgICAgICAgICAgICBpZiBrZXkucmVxdWlyZWQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBzaW1wbGUga2V5Iiwga2V5Lm1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkICc6JyIsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1tsZXZlbF0KKworICAgIGRlZiBzYXZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoc2VsZik6CisgICAgICAgICMgVGhlIG5leHQgdG9rZW4gbWF5IHN0YXJ0IGEgc2ltcGxlIGtleS4gV2UgY2hlY2sgaWYgaXQncyBwb3NzaWJsZQorICAgICAgICAjIGFuZCBzYXZlIGl0cyBwb3NpdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yCisgICAgICAgICMgICBBTElBUywgQU5DSE9SLCBUQUcsIFNDQUxBUihmbG93KSwgJ1snLCBhbmQgJ3snLgorCisgICAgICAgICMgQ2hlY2sgaWYgYSBzaW1wbGUga2V5IGlzIHJlcXVpcmVkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICByZXF1aXJlZCA9IG5vdCBzZWxmLmZsb3dfbGV2ZWwgYW5kIHNlbGYuaW5kZW50ID09IHNlbGYuY29sdW1uCisKKyAgICAgICAgIyBUaGUgbmV4dCB0b2tlbiBtaWdodCBiZSBhIHNpbXBsZSBrZXkuIExldCdzIHNhdmUgaXQncyBudW1iZXIgYW5kCisgICAgICAgICMgcG9zaXRpb24uCisgICAgICAgIGlmIHNlbGYuYWxsb3dfc2ltcGxlX2tleToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorICAgICAgICAgICAgdG9rZW5fbnVtYmVyID0gc2VsZi50b2tlbnNfdGFrZW4rbGVuKHNlbGYudG9rZW5zKQorICAgICAgICAgICAga2V5ID0gU2ltcGxlS2V5KHRva2VuX251bWJlciwgcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZXgsIHNlbGYubGluZSwgc2VsZi5jb2x1bW4sIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgICAgIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXNbc2VsZi5mbG93X2xldmVsXSA9IGtleQorCisgICAgZGVmIHJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KHNlbGYpOgorICAgICAgICAjIFJlbW92ZSB0aGUgc2F2ZWQgcG9zc2libGUga2V5IHBvc2l0aW9uIGF0IHRoZSBjdXJyZW50IGZsb3cgbGV2ZWwuCisgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbCBpbiBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzOgorICAgICAgICAgICAga2V5ID0gc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5c1tzZWxmLmZsb3dfbGV2ZWxdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGtleS5yZXF1aXJlZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgc2ltcGxlIGtleSIsIGtleS5tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkICc6JyIsIHNlbGYuZ2V0X21hcmsoKSkKKworICAgICAgICAgICAgZGVsIHNlbGYucG9zc2libGVfc2ltcGxlX2tleXNbc2VsZi5mbG93X2xldmVsXQorCisgICAgIyBJbmRlbnRhdGlvbiBmdW5jdGlvbnMuCisKKyAgICBkZWYgdW53aW5kX2luZGVudChzZWxmLCBjb2x1bW4pOgorCisgICAgICAgICMjIEluIGZsb3cgY29udGV4dCwgdG9rZW5zIHNob3VsZCByZXNwZWN0IGluZGVudGF0aW9uLgorICAgICAgICAjIyBBY3R1YWxseSB0aGUgY29uZGl0aW9uIHNob3VsZCBiZSBgc2VsZi5pbmRlbnQgPj0gY29sdW1uYCBhY2NvcmRpbmcgdG8KKyAgICAgICAgIyMgdGhlIHNwZWMuIEJ1dCB0aGlzIGNvbmRpdGlvbiB3aWxsIHByb2hpYml0IGludHVpdGl2ZWx5IGNvcnJlY3QKKyAgICAgICAgIyMgY29uc3RydWN0aW9ucyBzdWNoIGFzCisgICAgICAgICMjIGtleSA6IHsKKyAgICAgICAgIyMgfQorICAgICAgICAjaWYgc2VsZi5mbG93X2xldmVsIGFuZCBzZWxmLmluZGVudCA+IGNvbHVtbjoKKyAgICAgICAgIyAgICByYWlzZSBTY2FubmVyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgIyAgICAgICAgICAgICJpbnZhbGlkIGludGVuZGF0aW9uIG9yIHVuY2xvc2VkICdbJyBvciAneyciLAorICAgICAgICAjICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorCisgICAgICAgICMgSW4gdGhlIGZsb3cgY29udGV4dCwgaW5kZW50YXRpb24gaXMgaWdub3JlZC4gV2UgbWFrZSB0aGUgc2Nhbm5lciBsZXNzCisgICAgICAgICMgcmVzdHJpY3RpdmUgdGhlbiBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzLgorICAgICAgICBpZiBzZWxmLmZsb3dfbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEluIGJsb2NrIGNvbnRleHQsIHdlIG1heSBuZWVkIHRvIGlzc3VlIHRoZSBCTE9DSy1FTkQgdG9rZW5zLgorICAgICAgICB3aGlsZSBzZWxmLmluZGVudCA+IGNvbHVtbjoKKyAgICAgICAgICAgIG1hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnRzLnBvcCgpCisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoQmxvY2tFbmRUb2tlbihtYXJrLCBtYXJrKSkKKworICAgIGRlZiBhZGRfaW5kZW50KHNlbGYsIGNvbHVtbik6CisgICAgICAgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBpbmNyZWFzZSBpbmRlbnRhdGlvbi4KKyAgICAgICAgaWYgc2VsZi5pbmRlbnQgPCBjb2x1bW46CisgICAgICAgICAgICBzZWxmLmluZGVudHMuYXBwZW5kKHNlbGYuaW5kZW50KQorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBjb2x1bW4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBGZXRjaGVycy4KKworICAgIGRlZiBmZXRjaF9zdHJlYW1fc3RhcnQoc2VsZik6CisgICAgICAgICMgV2UgYWx3YXlzIGFkZCBTVFJFQU0tU1RBUlQgYXMgdGhlIGZpcnN0IHRva2VuIGFuZCBTVFJFQU0tRU5EIGFzIHRoZQorICAgICAgICAjIGxhc3QgdG9rZW4uCisKKyAgICAgICAgIyBSZWFkIHRoZSB0b2tlbi4KKyAgICAgICAgbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAKKyAgICAgICAgIyBBZGQgU1RSRUFNLVNUQVJULgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoU3RyZWFtU3RhcnRUb2tlbihtYXJrLCBtYXJrLAorICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZykpCisgICAgICAgIAorCisgICAgZGVmIGZldGNoX3N0cmVhbV9lbmQoc2VsZik6CisKKyAgICAgICAgIyBTZXQgdGhlIGN1cnJlbnQgaW50ZW5kYXRpb24gdG8gLTEuCisgICAgICAgIHNlbGYudW53aW5kX2luZGVudCgtMSkKKworICAgICAgICAjIFJlc2V0IHNpbXBsZSBrZXlzLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5wb3NzaWJsZV9zaW1wbGVfa2V5cyA9IHt9CisKKyAgICAgICAgIyBSZWFkIHRoZSB0b2tlbi4KKyAgICAgICAgbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAKKyAgICAgICAgIyBBZGQgU1RSRUFNLUVORC4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKFN0cmVhbUVuZFRva2VuKG1hcmssIG1hcmspKQorCisgICAgICAgICMgVGhlIHN0ZWFtIGlzIGZpbmlzaGVkLgorICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCisKKyAgICBkZWYgZmV0Y2hfZGlyZWN0aXZlKHNlbGYpOgorICAgICAgICAKKyAgICAgICAgIyBTZXQgdGhlIGN1cnJlbnQgaW50ZW5kYXRpb24gdG8gLTEuCisgICAgICAgIHNlbGYudW53aW5kX2luZGVudCgtMSkKKworICAgICAgICAjIFJlc2V0IHNpbXBsZSBrZXlzLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIFNjYW4gYW5kIGFkZCBESVJFQ1RJVkUuCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fZGlyZWN0aXZlKCkpCisKKyAgICBkZWYgZmV0Y2hfZG9jdW1lbnRfc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZG9jdW1lbnRfaW5kaWNhdG9yKERvY3VtZW50U3RhcnRUb2tlbikKKworICAgIGRlZiBmZXRjaF9kb2N1bWVudF9lbmQoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZG9jdW1lbnRfaW5kaWNhdG9yKERvY3VtZW50RW5kVG9rZW4pCisKKyAgICBkZWYgZmV0Y2hfZG9jdW1lbnRfaW5kaWNhdG9yKHNlbGYsIFRva2VuQ2xhc3MpOgorCisgICAgICAgICMgU2V0IHRoZSBjdXJyZW50IGludGVuZGF0aW9uIHRvIC0xLgorICAgICAgICBzZWxmLnVud2luZF9pbmRlbnQoLTEpCisKKyAgICAgICAgIyBSZXNldCBzaW1wbGUga2V5cy4gTm90ZSB0aGF0IHRoZXJlIGNvdWxkIG5vdCBiZSBhIGJsb2NrIGNvbGxlY3Rpb24KKyAgICAgICAgIyBhZnRlciAnLS0tJy4KKyAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IEZhbHNlCisKKyAgICAgICAgIyBBZGQgRE9DVU1FTlQtU1RBUlQgb3IgRE9DVU1FTlQtRU5ELgorICAgICAgICBzdGFydF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHNlbGYuZm9yd2FyZCgzKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoVG9rZW5DbGFzcyhzdGFydF9tYXJrLCBlbmRfbWFyaykpCisKKyAgICBkZWYgZmV0Y2hfZmxvd19zZXF1ZW5jZV9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9mbG93X2NvbGxlY3Rpb25fc3RhcnQoRmxvd1NlcXVlbmNlU3RhcnRUb2tlbikKKworICAgIGRlZiBmZXRjaF9mbG93X21hcHBpbmdfc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuZmV0Y2hfZmxvd19jb2xsZWN0aW9uX3N0YXJ0KEZsb3dNYXBwaW5nU3RhcnRUb2tlbikKKworICAgIGRlZiBmZXRjaF9mbG93X2NvbGxlY3Rpb25fc3RhcnQoc2VsZiwgVG9rZW5DbGFzcyk6CisKKyAgICAgICAgIyAnWycgYW5kICd7JyBtYXkgc3RhcnQgYSBzaW1wbGUga2V5LgorICAgICAgICBzZWxmLnNhdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBJbmNyZWFzZSB0aGUgZmxvdyBsZXZlbC4KKyAgICAgICAgc2VsZi5mbG93X2xldmVsICs9IDEKKworICAgICAgICAjIFNpbXBsZSBrZXlzIGFyZSBhbGxvd2VkIGFmdGVyICdbJyBhbmQgJ3snLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBUcnVlCisKKyAgICAgICAgIyBBZGQgRkxPVy1TRVFVRU5DRS1TVEFSVCBvciBGTE9XLU1BUFBJTkctU1RBUlQuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKFRva2VuQ2xhc3Moc3RhcnRfbWFyaywgZW5kX21hcmspKQorCisgICAgZGVmIGZldGNoX2Zsb3dfc2VxdWVuY2VfZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Zsb3dfY29sbGVjdGlvbl9lbmQoRmxvd1NlcXVlbmNlRW5kVG9rZW4pCisKKyAgICBkZWYgZmV0Y2hfZmxvd19tYXBwaW5nX2VuZChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9mbG93X2NvbGxlY3Rpb25fZW5kKEZsb3dNYXBwaW5nRW5kVG9rZW4pCisKKyAgICBkZWYgZmV0Y2hfZmxvd19jb2xsZWN0aW9uX2VuZChzZWxmLCBUb2tlbkNsYXNzKToKKworICAgICAgICAjIFJlc2V0IHBvc3NpYmxlIHNpbXBsZSBrZXkgb24gdGhlIGN1cnJlbnQgbGV2ZWwuCisgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgRGVjcmVhc2UgdGhlIGZsb3cgbGV2ZWwuCisgICAgICAgIHNlbGYuZmxvd19sZXZlbCAtPSAxCisKKyAgICAgICAgIyBObyBzaW1wbGUga2V5cyBhZnRlciAnXScgb3IgJ30nLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgQWRkIEZMT1ctU0VRVUVOQ0UtRU5EIG9yIEZMT1ctTUFQUElORy1FTkQuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKFRva2VuQ2xhc3Moc3RhcnRfbWFyaywgZW5kX21hcmspKQorCisgICAgZGVmIGZldGNoX2Zsb3dfZW50cnkoc2VsZik6CisKKyAgICAgICAgIyBTaW1wbGUga2V5cyBhcmUgYWxsb3dlZCBhZnRlciAnLCcuCisgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IFRydWUKKworICAgICAgICAjIFJlc2V0IHBvc3NpYmxlIHNpbXBsZSBrZXkgb24gdGhlIGN1cnJlbnQgbGV2ZWwuCisgICAgICAgIHNlbGYucmVtb3ZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgQWRkIEZMT1ctRU5UUlkuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEZsb3dFbnRyeVRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKSkKKworICAgIGRlZiBmZXRjaF9ibG9ja19lbnRyeShzZWxmKToKKworICAgICAgICAjIEJsb2NrIGNvbnRleHQgbmVlZHMgYWRkaXRpb25hbCBjaGVja3MuCisgICAgICAgIGlmIG5vdCBzZWxmLmZsb3dfbGV2ZWw6CisKKyAgICAgICAgICAgICMgQXJlIHdlIGFsbG93ZWQgdG8gc3RhcnQgYSBuZXcgZW50cnk/CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd19zaW1wbGVfa2V5OgorICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcihOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIGVudHJpZXMgYXJlIG5vdCBhbGxvd2VkIGhlcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorCisgICAgICAgICAgICAjIFdlIG1heSBuZWVkIHRvIGFkZCBCTE9DSy1TRVFVRU5DRS1TVEFSVC4KKyAgICAgICAgICAgIGlmIHNlbGYuYWRkX2luZGVudChzZWxmLmNvbHVtbik6CisgICAgICAgICAgICAgICAgbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChCbG9ja1NlcXVlbmNlU3RhcnRUb2tlbihtYXJrLCBtYXJrKSkKKworICAgICAgICAjIEl0J3MgYW4gZXJyb3IgZm9yIHRoZSBibG9jayBlbnRyeSB0byBvY2N1ciBpbiB0aGUgZmxvdyBjb250ZXh0LAorICAgICAgICAjIGJ1dCB3ZSBsZXQgdGhlIHBhcnNlciBkZXRlY3QgdGhpcy4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFNpbXBsZSBrZXlzIGFyZSBhbGxvd2VkIGFmdGVyICctJy4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gVHJ1ZQorCisgICAgICAgICMgUmVzZXQgcG9zc2libGUgc2ltcGxlIGtleSBvbiB0aGUgY3VycmVudCBsZXZlbC4KKyAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBBZGQgQkxPQ0stRU5UUlkuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEJsb2NrRW50cnlUb2tlbihzdGFydF9tYXJrLCBlbmRfbWFyaykpCisKKyAgICBkZWYgZmV0Y2hfa2V5KHNlbGYpOgorICAgICAgICAKKyAgICAgICAgIyBCbG9jayBjb250ZXh0IG5lZWRzIGFkZGl0aW9uYWwgY2hlY2tzLgorICAgICAgICBpZiBub3Qgc2VsZi5mbG93X2xldmVsOgorCisgICAgICAgICAgICAjIEFyZSB3ZSBhbGxvd2VkIHRvIHN0YXJ0IGEga2V5IChub3QgbmVzc2VzYXJ5IGEgc2ltcGxlKT8KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93X3NpbXBsZV9rZXk6CisgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFwcGluZyBrZXlzIGFyZSBub3QgYWxsb3dlZCBoZXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKworICAgICAgICAgICAgIyBXZSBtYXkgbmVlZCB0byBhZGQgQkxPQ0stTUFQUElORy1TVEFSVC4KKyAgICAgICAgICAgIGlmIHNlbGYuYWRkX2luZGVudChzZWxmLmNvbHVtbik6CisgICAgICAgICAgICAgICAgbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChCbG9ja01hcHBpbmdTdGFydFRva2VuKG1hcmssIG1hcmspKQorCisgICAgICAgICMgU2ltcGxlIGtleXMgYXJlIGFsbG93ZWQgYWZ0ZXIgJz8nIGluIHRoZSBibG9jayBjb250ZXh0LgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBub3Qgc2VsZi5mbG93X2xldmVsCisKKyAgICAgICAgIyBSZXNldCBwb3NzaWJsZSBzaW1wbGUga2V5IG9uIHRoZSBjdXJyZW50IGxldmVsLgorICAgICAgICBzZWxmLnJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIEFkZCBLRVkuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKEtleVRva2VuKHN0YXJ0X21hcmssIGVuZF9tYXJrKSkKKworICAgIGRlZiBmZXRjaF92YWx1ZShzZWxmKToKKworICAgICAgICAjIERvIHdlIGRldGVybWluZSBhIHNpbXBsZSBrZXk/CisgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbCBpbiBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzOgorCisgICAgICAgICAgICAjIEFkZCBLRVkuCisgICAgICAgICAgICBrZXkgPSBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW3NlbGYuZmxvd19sZXZlbF0KKyAgICAgICAgICAgIGRlbCBzZWxmLnBvc3NpYmxlX3NpbXBsZV9rZXlzW3NlbGYuZmxvd19sZXZlbF0KKyAgICAgICAgICAgIHNlbGYudG9rZW5zLmluc2VydChrZXkudG9rZW5fbnVtYmVyLXNlbGYudG9rZW5zX3Rha2VuLAorICAgICAgICAgICAgICAgICAgICBLZXlUb2tlbihrZXkubWFyaywga2V5Lm1hcmspKQorCisgICAgICAgICAgICAjIElmIHRoaXMga2V5IHN0YXJ0cyBhIG5ldyBibG9jayBtYXBwaW5nLCB3ZSBuZWVkIHRvIGFkZAorICAgICAgICAgICAgIyBCTE9DSy1NQVBQSU5HLVNUQVJULgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFkZF9pbmRlbnQoa2V5LmNvbHVtbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmluc2VydChrZXkudG9rZW5fbnVtYmVyLXNlbGYudG9rZW5zX3Rha2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4oa2V5Lm1hcmssIGtleS5tYXJrKSkKKworICAgICAgICAgICAgIyBUaGVyZSBjYW5ub3QgYmUgdHdvIHNpbXBsZSBrZXlzIG9uZSBhZnRlciBhbm90aGVyLgorICAgICAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIEl0IG11c3QgYmUgYSBwYXJ0IG9mIGEgY29tcGxleCBrZXkuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgQmxvY2sgY29udGV4dCBuZWVkcyBhZGRpdGlvbmFsIGNoZWNrcy4KKyAgICAgICAgICAgICMgKERvIHdlIHJlYWxseSBuZWVkIHRoZW0/IFRoZXkgd2lsbCBiZSBjYXRjaGVkIGJ5IHRoZSBwYXJzZXIKKyAgICAgICAgICAgICMgYW55d2F5LikKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZsb3dfbGV2ZWw6CisKKyAgICAgICAgICAgICAgICAjIFdlIGFyZSBhbGxvd2VkIHRvIHN0YXJ0IGEgY29tcGxleCB2YWx1ZSBpZiBhbmQgb25seSBpZgorICAgICAgICAgICAgICAgICMgd2UgY2FuIHN0YXJ0IGEgc2ltcGxlIGtleS4KKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd19zaW1wbGVfa2V5OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwcGluZyB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGhlcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKworICAgICAgICAgICAgIyBJZiB0aGlzIHZhbHVlIHN0YXJ0cyBhIG5ldyBibG9jayBtYXBwaW5nLCB3ZSBuZWVkIHRvIGFkZAorICAgICAgICAgICAgIyBCTE9DSy1NQVBQSU5HLVNUQVJULiAgSXQgd2lsbCBiZSBkZXRlY3RlZCBhcyBhbiBlcnJvciBsYXRlciBieQorICAgICAgICAgICAgIyB0aGUgcGFyc2VyLgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFkZF9pbmRlbnQoc2VsZi5jb2x1bW4pOgorICAgICAgICAgICAgICAgICAgICBtYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChCbG9ja01hcHBpbmdTdGFydFRva2VuKG1hcmssIG1hcmspKQorCisgICAgICAgICAgICAjIFNpbXBsZSBrZXlzIGFyZSBhbGxvd2VkIGFmdGVyICc6JyBpbiB0aGUgYmxvY2sgY29udGV4dC4KKyAgICAgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IG5vdCBzZWxmLmZsb3dfbGV2ZWwKKworICAgICAgICAgICAgIyBSZXNldCBwb3NzaWJsZSBzaW1wbGUga2V5IG9uIHRoZSBjdXJyZW50IGxldmVsLgorICAgICAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBBZGQgVkFMVUUuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKFZhbHVlVG9rZW4oc3RhcnRfbWFyaywgZW5kX21hcmspKQorCisgICAgZGVmIGZldGNoX2FsaWFzKHNlbGYpOgorCisgICAgICAgICMgQUxJQVMgY291bGQgYmUgYSBzaW1wbGUga2V5LgorICAgICAgICBzZWxmLnNhdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBObyBzaW1wbGUga2V5cyBhZnRlciBBTElBUy4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIFNjYW4gYW5kIGFkZCBBTElBUy4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9hbmNob3IoQWxpYXNUb2tlbikpCisKKyAgICBkZWYgZmV0Y2hfYW5jaG9yKHNlbGYpOgorCisgICAgICAgICMgQU5DSE9SIGNvdWxkIHN0YXJ0IGEgc2ltcGxlIGtleS4KKyAgICAgICAgc2VsZi5zYXZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgTm8gc2ltcGxlIGtleXMgYWZ0ZXIgQU5DSE9SLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIEFOQ0hPUi4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9hbmNob3IoQW5jaG9yVG9rZW4pKQorCisgICAgZGVmIGZldGNoX3RhZyhzZWxmKToKKworICAgICAgICAjIFRBRyBjb3VsZCBzdGFydCBhIHNpbXBsZSBrZXkuCisgICAgICAgIHNlbGYuc2F2ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIE5vIHNpbXBsZSBrZXlzIGFmdGVyIFRBRy4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIFNjYW4gYW5kIGFkZCBUQUcuCisgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fdGFnKCkpCisKKyAgICBkZWYgZmV0Y2hfbGl0ZXJhbChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9ibG9ja19zY2FsYXIoc3R5bGU9J3wnKQorCisgICAgZGVmIGZldGNoX2ZvbGRlZChzZWxmKToKKyAgICAgICAgc2VsZi5mZXRjaF9ibG9ja19zY2FsYXIoc3R5bGU9Jz4nKQorCisgICAgZGVmIGZldGNoX2Jsb2NrX3NjYWxhcihzZWxmLCBzdHlsZSk6CisKKyAgICAgICAgIyBBIHNpbXBsZSBrZXkgbWF5IGZvbGxvdyBhIGJsb2NrIHNjYWxhci4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gVHJ1ZQorCisgICAgICAgICMgUmVzZXQgcG9zc2libGUgc2ltcGxlIGtleSBvbiB0aGUgY3VycmVudCBsZXZlbC4KKyAgICAgICAgc2VsZi5yZW1vdmVfcG9zc2libGVfc2ltcGxlX2tleSgpCisKKyAgICAgICAgIyBTY2FuIGFuZCBhZGQgU0NBTEFSLgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2Jsb2NrX3NjYWxhcihzdHlsZSkpCisKKyAgICBkZWYgZmV0Y2hfc2luZ2xlKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Zsb3dfc2NhbGFyKHN0eWxlPSdcJycpCisKKyAgICBkZWYgZmV0Y2hfZG91YmxlKHNlbGYpOgorICAgICAgICBzZWxmLmZldGNoX2Zsb3dfc2NhbGFyKHN0eWxlPSciJykKKworICAgIGRlZiBmZXRjaF9mbG93X3NjYWxhcihzZWxmLCBzdHlsZSk6CisKKyAgICAgICAgIyBBIGZsb3cgc2NhbGFyIGNvdWxkIGJlIGEgc2ltcGxlIGtleS4KKyAgICAgICAgc2VsZi5zYXZlX3Bvc3NpYmxlX3NpbXBsZV9rZXkoKQorCisgICAgICAgICMgTm8gc2ltcGxlIGtleXMgYWZ0ZXIgZmxvdyBzY2FsYXJzLgorICAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXkgPSBGYWxzZQorCisgICAgICAgICMgU2NhbiBhbmQgYWRkIFNDQUxBUi4KKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9mbG93X3NjYWxhcihzdHlsZSkpCisKKyAgICBkZWYgZmV0Y2hfcGxhaW4oc2VsZik6CisKKyAgICAgICAgIyBBIHBsYWluIHNjYWxhciBjb3VsZCBiZSBhIHNpbXBsZSBrZXkuCisgICAgICAgIHNlbGYuc2F2ZV9wb3NzaWJsZV9zaW1wbGVfa2V5KCkKKworICAgICAgICAjIE5vIHNpbXBsZSBrZXlzIGFmdGVyIHBsYWluIHNjYWxhcnMuIEJ1dCBub3RlIHRoYXQgYHNjYW5fcGxhaW5gIHdpbGwKKyAgICAgICAgIyBjaGFuZ2UgdGhpcyBmbGFnIGlmIHRoZSBzY2FuIGlzIGZpbmlzaGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgICMgbGluZS4KKyAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gRmFsc2UKKworICAgICAgICAjIFNjYW4gYW5kIGFkZCBTQ0FMQVIuIE1heSBjaGFuZ2UgYGFsbG93X3NpbXBsZV9rZXlgLgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX3BsYWluKCkpCisKKyAgICAjIENoZWNrZXJzLgorCisgICAgZGVmIGNoZWNrX2RpcmVjdGl2ZShzZWxmKToKKworICAgICAgICAjIERJUkVDVElWRTogICAgICAgIF4gJyUnIC4uLgorICAgICAgICAjIFRoZSAnJScgaW5kaWNhdG9yIGlzIGFscmVhZHkgY2hlY2tlZC4KKyAgICAgICAgaWYgc2VsZi5jb2x1bW4gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tfZG9jdW1lbnRfc3RhcnQoc2VsZik6CisKKyAgICAgICAgIyBET0NVTUVOVC1TVEFSVDogICBeICctLS0nICgnICd8J1xuJykKKyAgICAgICAgaWYgc2VsZi5jb2x1bW4gPT0gMDoKKyAgICAgICAgICAgIGlmIHNlbGYucHJlZml4KDMpID09ICctLS0nICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsoMykgaW4gJ1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tfZG9jdW1lbnRfZW5kKHNlbGYpOgorCisgICAgICAgICMgRE9DVU1FTlQtRU5EOiAgICAgXiAnLi4uJyAoJyAnfCdcbicpCisgICAgICAgIGlmIHNlbGYuY29sdW1uID09IDA6CisgICAgICAgICAgICBpZiBzZWxmLnByZWZpeCgzKSA9PSAnLi4uJyAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5wZWVrKDMpIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrX2Jsb2NrX2VudHJ5KHNlbGYpOgorCisgICAgICAgICMgQkxPQ0stRU5UUlk6ICAgICAgJy0nICgnICd8J1xuJykKKyAgICAgICAgcmV0dXJuIHNlbGYucGVlaygxKSBpbiAnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOScKKworICAgIGRlZiBjaGVja19rZXkoc2VsZik6CisKKyAgICAgICAgIyBLRVkoZmxvdyBjb250ZXh0KTogICAgJz8nCisgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBLRVkoYmxvY2sgY29udGV4dCk6ICAgJz8nICgnICd8J1xuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBlZWsoMSkgaW4gJ1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknCisKKyAgICBkZWYgY2hlY2tfdmFsdWUoc2VsZik6CisKKyAgICAgICAgIyBWQUxVRShmbG93IGNvbnRleHQpOiAgJzonCisgICAgICAgIGlmIHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBWQUxVRShibG9jayBjb250ZXh0KTogJzonICgnICd8J1xuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBlZWsoMSkgaW4gJ1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknCisKKyAgICBkZWYgY2hlY2tfcGxhaW4oc2VsZik6CisKKyAgICAgICAgIyBBIHBsYWluIHNjYWxhciBtYXkgc3RhcnQgd2l0aCBhbnkgbm9uLXNwYWNlIGNoYXJhY3RlciBleGNlcHQ6CisgICAgICAgICMgICAnLScsICc/JywgJzonLCAnLCcsICdbJywgJ10nLCAneycsICd9JywKKyAgICAgICAgIyAgICcjJywgJyYnLCAnKicsICchJywgJ3wnLCAnPicsICdcJycsICdcIicsCisgICAgICAgICMgICAnJScsICdAJywgJ2AnLgorICAgICAgICAjCisgICAgICAgICMgSXQgbWF5IGFsc28gc3RhcnQgd2l0aAorICAgICAgICAjICAgJy0nLCAnPycsICc6JworICAgICAgICAjIGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbm9uLXNwYWNlIGNoYXJhY3Rlci4KKyAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBsaW1pdCB0aGUgbGFzdCBydWxlIHRvIHRoZSBibG9jayBjb250ZXh0IChleGNlcHQgdGhlCisgICAgICAgICMgJy0nIGNoYXJhY3RlcikgYmVjYXVzZSB3ZSB3YW50IHRoZSBmbG93IGNvbnRleHQgdG8gYmUgc3BhY2UKKyAgICAgICAgIyBpbmRlcGVuZGVudC4KKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICByZXR1cm4gY2ggbm90IGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5LT86LFtde30jJiohfD5cJ1wiJUBgJyAgXAorICAgICAgICAgICAgICAgIG9yIChzZWxmLnBlZWsoMSkgbm90IGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JworICAgICAgICAgICAgICAgICAgICAgICAgYW5kIChjaCA9PSAnLScgb3IgKG5vdCBzZWxmLmZsb3dfbGV2ZWwgYW5kIGNoIGluICc/OicpKSkKKworICAgICMgU2Nhbm5lcnMuCisKKyAgICBkZWYgc2Nhbl90b19uZXh0X3Rva2VuKHNlbGYpOgorICAgICAgICAjIFdlIGlnbm9yZSBzcGFjZXMsIGxpbmUgYnJlYWtzIGFuZCBjb21tZW50cy4KKyAgICAgICAgIyBJZiB3ZSBmaW5kIGEgbGluZSBicmVhayBpbiB0aGUgYmxvY2sgY29udGV4dCwgd2Ugc2V0IHRoZSBmbGFnCisgICAgICAgICMgYGFsbG93X3NpbXBsZV9rZXlgIG9uLgorICAgICAgICAjIFRoZSBieXRlIG9yZGVyIG1hcmsgaXMgc3RyaXBwZWQgaWYgaXQncyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQorICAgICAgICAjIHN0cmVhbS4gV2UgZG8gbm90IHlldCBzdXBwb3J0IEJPTSBpbnNpZGUgdGhlIHN0cmVhbSBhcyB0aGUKKyAgICAgICAgIyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzLiBBbnkgc3VjaCBtYXJrIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBhIHBhcnQKKyAgICAgICAgIyBvZiB0aGUgZG9jdW1lbnQuCisgICAgICAgICMKKyAgICAgICAgIyBUT0RPOiBXZSBuZWVkIHRvIG1ha2UgdGFiIGhhbmRsaW5nIHJ1bGVzIG1vcmUgc2FuZS4gQSBnb29kIHJ1bGUgaXMKKyAgICAgICAgIyAgIFRhYnMgY2Fubm90IHByZWNlZGUgdG9rZW5zCisgICAgICAgICMgICBCTE9DSy1TRVFVRU5DRS1TVEFSVCwgQkxPQ0stTUFQUElORy1TVEFSVCwgQkxPQ0stRU5ELAorICAgICAgICAjICAgS0VZKGJsb2NrKSwgVkFMVUUoYmxvY2spLCBCTE9DSy1FTlRSWQorICAgICAgICAjIFNvIHRoZSBjaGVja2luZyBjb2RlIGlzCisgICAgICAgICMgICBpZiA8VEFCPjoKKyAgICAgICAgIyAgICAgICBzZWxmLmFsbG93X3NpbXBsZV9rZXlzID0gRmFsc2UKKyAgICAgICAgIyBXZSBhbHNvIG5lZWQgdG8gYWRkIHRoZSBjaGVjayBmb3IgYGFsbG93X3NpbXBsZV9rZXlzID09IFRydWVgIHRvCisgICAgICAgICMgYHVud2luZF9pbmRlbnRgIGJlZm9yZSBpc3N1aW5nIEJMT0NLLUVORC4KKyAgICAgICAgIyBTY2FubmVycyBmb3IgYmxvY2ssIGZsb3csIGFuZCBwbGFpbiBzY2FsYXJzIG5lZWQgdG8gYmUgbW9kaWZpZWQuCisKKyAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwIGFuZCBzZWxmLnBlZWsoKSA9PSAnXHVGRUZGJzoKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGZvdW5kOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gJyAnOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICBpZiBzZWxmLnBlZWsoKSA9PSAnIyc6CisgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgbm90IGluICdcMFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc2Nhbl9saW5lX2JyZWFrKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZmxvd19sZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19zaW1wbGVfa2V5ID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKworICAgIGRlZiBzY2FuX2RpcmVjdGl2ZShzZWxmKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgbmFtZSA9IHNlbGYuc2Nhbl9kaXJlY3RpdmVfbmFtZShzdGFydF9tYXJrKQorICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgaWYgbmFtZSA9PSAnWUFNTCc6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuc2Nhbl95YW1sX2RpcmVjdGl2ZV92YWx1ZShzdGFydF9tYXJrKQorICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgZWxpZiBuYW1lID09ICdUQUcnOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnNjYW5fdGFnX2RpcmVjdGl2ZV92YWx1ZShzdGFydF9tYXJrKQorICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSBub3QgaW4gJ1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIHNlbGYuc2Nhbl9kaXJlY3RpdmVfaWdub3JlZF9saW5lKHN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiBEaXJlY3RpdmVUb2tlbihuYW1lLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspCisKKyAgICBkZWYgc2Nhbl9kaXJlY3RpdmVfbmFtZShzZWxmLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIGxlbmd0aCA9IDAKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsobGVuZ3RoKQorICAgICAgICB3aGlsZSAnMCcgPD0gY2ggPD0gJzknIG9yICdBJyA8PSBjaCA8PSAnWicgb3IgJ2EnIDw9IGNoIDw9ICd6JyAgXAorICAgICAgICAgICAgICAgIG9yIGNoIGluICctXyc6CisgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsobGVuZ3RoKQorICAgICAgICBpZiBub3QgbGVuZ3RoOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGRpcmVjdGl2ZSIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhbHBoYWJldGljIG9yIG51bWVyaWMgY2hhcmFjdGVyLCBidXQgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgICAgICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluICdcMCBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGFscGhhYmV0aWMgb3IgbnVtZXJpYyBjaGFyYWN0ZXIsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX3lhbWxfZGlyZWN0aXZlX3ZhbHVlKHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gJyAnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgbWFqb3IgPSBzZWxmLnNjYW5feWFtbF9kaXJlY3RpdmVfbnVtYmVyKHN0YXJ0X21hcmspCisgICAgICAgIGlmIHNlbGYucGVlaygpICE9ICcuJzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkaXJlY3RpdmUiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBkaWdpdCBvciAnLicsIGJ1dCBmb3VuZCAlciIgJSBzZWxmLnBlZWsoKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBtaW5vciA9IHNlbGYuc2Nhbl95YW1sX2RpcmVjdGl2ZV9udW1iZXIoc3RhcnRfbWFyaykKKyAgICAgICAgaWYgc2VsZi5wZWVrKCkgbm90IGluICdcMCBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgZGlnaXQgb3IgJyAnLCBidXQgZm91bmQgJXIiICUgc2VsZi5wZWVrKCksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpCisKKyAgICBkZWYgc2Nhbl95YW1sX2RpcmVjdGl2ZV9udW1iZXIoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIG5vdCAoJzAnIDw9IGNoIDw9ICc5Jyk6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgZGlnaXQsIGJ1dCBmb3VuZCAlciIgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICBsZW5ndGggPSAwCisgICAgICAgIHdoaWxlICcwJyA8PSBzZWxmLnBlZWsobGVuZ3RoKSA8PSAnOSc6CisgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICB2YWx1ZSA9IGludChzZWxmLnByZWZpeChsZW5ndGgpKQorICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX3RhZ19kaXJlY3RpdmVfdmFsdWUoc2VsZiwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSA9PSAnICc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBoYW5kbGUgPSBzZWxmLnNjYW5fdGFnX2RpcmVjdGl2ZV9oYW5kbGUoc3RhcnRfbWFyaykKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gJyAnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgcHJlZml4ID0gc2VsZi5zY2FuX3RhZ19kaXJlY3RpdmVfcHJlZml4KHN0YXJ0X21hcmspCisgICAgICAgIHJldHVybiAoaGFuZGxlLCBwcmVmaXgpCisKKyAgICBkZWYgc2Nhbl90YWdfZGlyZWN0aXZlX2hhbmRsZShzZWxmLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHZhbHVlID0gc2VsZi5zY2FuX3RhZ19oYW5kbGUoJ2RpcmVjdGl2ZScsIHN0YXJ0X21hcmspCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggIT0gJyAnOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGRpcmVjdGl2ZSIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnICcsIGJ1dCBmb3VuZCAlciIgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX3RhZ19kaXJlY3RpdmVfcHJlZml4KHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgdmFsdWUgPSBzZWxmLnNjYW5fdGFnX3VyaSgnZGlyZWN0aXZlJywgc3RhcnRfbWFyaykKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBub3QgaW4gJ1wwIFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkaXJlY3RpdmUiLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJyAnLCBidXQgZm91bmQgJXIiICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgc2Nhbl9kaXJlY3RpdmVfaWdub3JlZF9saW5lKHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gJyAnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgaWYgc2VsZi5wZWVrKCkgPT0gJyMnOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgbm90IGluICdcMFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoIG5vdCBpbiAnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgZGlyZWN0aXZlIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgY29tbWVudCBvciBhIGxpbmUgYnJlYWssIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgc2VsZi5zY2FuX2xpbmVfYnJlYWsoKQorCisgICAgZGVmIHNjYW5fYW5jaG9yKHNlbGYsIFRva2VuQ2xhc3MpOgorICAgICAgICAjIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNoYXJhY3RlcnMgZm9yIGFuY2hvcnMgYW5kCisgICAgICAgICMgYWxpYXNlcy4gVGhpcyBtYXkgbGVhZCB0byBwcm9ibGVtcywgZm9yIGluc3RhbmNlLCB0aGUgZG9jdW1lbnQ6CisgICAgICAgICMgICBbICphbGlhcywgdmFsdWUgXQorICAgICAgICAjIGNhbiBiZSBpbnRlcnB0ZXRlZCBpbiB0d28gd2F5cywgYXMKKyAgICAgICAgIyAgIFsgInZhbHVlIiBdCisgICAgICAgICMgYW5kCisgICAgICAgICMgICBbICphbGlhcyAsICJ2YWx1ZSIgXQorICAgICAgICAjIFRoZXJlZm9yZSB3ZSByZXN0cmljdCBhbGlhc2VzIHRvIG51bWJlcnMgYW5kIEFTQ0lJIGxldHRlcnMuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgaW5kaWNhdG9yID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgaW5kaWNhdG9yID09ICcqJzoKKyAgICAgICAgICAgIG5hbWUgPSAnYWxpYXMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gJ2FuY2hvcicKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIHdoaWxlICcwJyA8PSBjaCA8PSAnOScgb3IgJ0EnIDw9IGNoIDw9ICdaJyBvciAnYScgPD0gY2ggPD0gJ3onICBcCisgICAgICAgICAgICAgICAgb3IgY2ggaW4gJy1fJzoKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIGlmIG5vdCBsZW5ndGg6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGFuICVzIiAlIG5hbWUsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhbHBoYWJldGljIG9yIG51bWVyaWMgY2hhcmFjdGVyLCBidXQgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgICAgICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5PzosXX0lQGAnOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhbiAlcyIgJSBuYW1lLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYWxwaGFiZXRpYyBvciBudW1lcmljIGNoYXJhY3RlciwgYnV0IGZvdW5kICVyIgorICAgICAgICAgICAgICAgICAgICAlIGNoLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHJldHVybiBUb2tlbkNsYXNzKHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyaykKKworICAgIGRlZiBzY2FuX3RhZyhzZWxmKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHN0YXJ0X21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoMSkKKyAgICAgICAgaWYgY2ggPT0gJzwnOgorICAgICAgICAgICAgaGFuZGxlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKDIpCisgICAgICAgICAgICBzdWZmaXggPSBzZWxmLnNjYW5fdGFnX3VyaSgndGFnJywgc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGlmIHNlbGYucGVlaygpICE9ICc+JzoKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSB0YWciLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICc+JywgYnV0IGZvdW5kICVyIiAlIHNlbGYucGVlaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgZWxpZiBjaCBpbiAnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBoYW5kbGUgPSBOb25lCisgICAgICAgICAgICBzdWZmaXggPSAnIScKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsZW5ndGggPSAxCisgICAgICAgICAgICB1c2VfaGFuZGxlID0gRmFsc2UKKyAgICAgICAgICAgIHdoaWxlIGNoIG5vdCBpbiAnXDAgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGlmIGNoID09ICchJzoKKyAgICAgICAgICAgICAgICAgICAgdXNlX2hhbmRsZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKGxlbmd0aCkKKyAgICAgICAgICAgIGhhbmRsZSA9ICchJworICAgICAgICAgICAgaWYgdXNlX2hhbmRsZToKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLnNjYW5fdGFnX2hhbmRsZSgndGFnJywgc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGFuZGxlID0gJyEnCisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuc2Nhbl90YWdfdXJpKCd0YWcnLCBzdGFydF9tYXJrKQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoIG5vdCBpbiAnXDAgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIHRhZyIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnICcsIGJ1dCBmb3VuZCAlciIgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICB2YWx1ZSA9IChoYW5kbGUsIHN1ZmZpeCkKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgcmV0dXJuIFRhZ1Rva2VuKHZhbHVlLCBzdGFydF9tYXJrLCBlbmRfbWFyaykKKworICAgIGRlZiBzY2FuX2Jsb2NrX3NjYWxhcihzZWxmLCBzdHlsZSk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorCisgICAgICAgIGlmIHN0eWxlID09ICc+JzoKKyAgICAgICAgICAgIGZvbGRlZCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvbGRlZCA9IEZhbHNlCisKKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgc3RhcnRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorCisgICAgICAgICMgU2NhbiB0aGUgaGVhZGVyLgorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBjaG9tcGluZywgaW5jcmVtZW50ID0gc2VsZi5zY2FuX2Jsb2NrX3NjYWxhcl9pbmRpY2F0b3JzKHN0YXJ0X21hcmspCisgICAgICAgIHNlbGYuc2Nhbl9ibG9ja19zY2FsYXJfaWdub3JlZF9saW5lKHN0YXJ0X21hcmspCisKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGluZGVudGF0aW9uIGxldmVsIGFuZCBnbyB0byB0aGUgZmlyc3Qgbm9uLWVtcHR5IGxpbmUuCisgICAgICAgIG1pbl9pbmRlbnQgPSBzZWxmLmluZGVudCsxCisgICAgICAgIGlmIG1pbl9pbmRlbnQgPCAxOgorICAgICAgICAgICAgbWluX2luZGVudCA9IDEKKyAgICAgICAgaWYgaW5jcmVtZW50IGlzIE5vbmU6CisgICAgICAgICAgICBicmVha3MsIG1heF9pbmRlbnQsIGVuZF9tYXJrID0gc2VsZi5zY2FuX2Jsb2NrX3NjYWxhcl9pbmRlbnRhdGlvbigpCisgICAgICAgICAgICBpbmRlbnQgPSBtYXgobWluX2luZGVudCwgbWF4X2luZGVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZGVudCA9IG1pbl9pbmRlbnQraW5jcmVtZW50LTEKKyAgICAgICAgICAgIGJyZWFrcywgZW5kX21hcmsgPSBzZWxmLnNjYW5fYmxvY2tfc2NhbGFyX2JyZWFrcyhpbmRlbnQpCisgICAgICAgIGxpbmVfYnJlYWsgPSAnJworCisgICAgICAgICMgU2NhbiB0aGUgaW5uZXIgcGFydCBvZiB0aGUgYmxvY2sgc2NhbGFyLgorICAgICAgICB3aGlsZSBzZWxmLmNvbHVtbiA9PSBpbmRlbnQgYW5kIHNlbGYucGVlaygpICE9ICdcMCc6CisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKGJyZWFrcykKKyAgICAgICAgICAgIGxlYWRpbmdfbm9uX3NwYWNlID0gc2VsZi5wZWVrKCkgbm90IGluICcgXHQnCisgICAgICAgICAgICBsZW5ndGggPSAwCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsobGVuZ3RoKSBub3QgaW4gJ1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYucHJlZml4KGxlbmd0aCkpCisgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgbGluZV9icmVhayA9IHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgIGJyZWFrcywgZW5kX21hcmsgPSBzZWxmLnNjYW5fYmxvY2tfc2NhbGFyX2JyZWFrcyhpbmRlbnQpCisgICAgICAgICAgICBpZiBzZWxmLmNvbHVtbiA9PSBpbmRlbnQgYW5kIHNlbGYucGVlaygpICE9ICdcMCc6CisKKyAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHksIGZvbGRpbmcgcnVsZXMgYXJlIGFtYmlndW91cy4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBmb2xkaW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbjoKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBmb2xkZWQgYW5kIGxpbmVfYnJlYWsgPT0gJ1xuJyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGVhZGluZ19ub25fc3BhY2UgYW5kIHNlbGYucGVlaygpIG5vdCBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJyZWFrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoJyAnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgQ2xhcmsgRXZhbnMncyBpbnRlcnByZXRhdGlvbiAoYWxzbyBpbiB0aGUgc3BlYworICAgICAgICAgICAgICAgICMgZXhhbXBsZXMpOgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjaWYgZm9sZGVkIGFuZCBsaW5lX2JyZWFrID09ICdcbic6CisgICAgICAgICAgICAgICAgIyAgICBpZiBub3QgYnJlYWtzOgorICAgICAgICAgICAgICAgICMgICAgICAgIGlmIHNlbGYucGVlaygpIG5vdCBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAjICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgIyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChsaW5lX2JyZWFrKQorICAgICAgICAgICAgICAgICNlbHNlOgorICAgICAgICAgICAgICAgICMgICAgY2h1bmtzLmFwcGVuZChsaW5lX2JyZWFrKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgQ2hvbXAgdGhlIHRhaWwuCisgICAgICAgIGlmIGNob21waW5nIGlzIG5vdCBGYWxzZToKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgaWYgY2hvbXBpbmcgaXMgVHJ1ZToKKyAgICAgICAgICAgIGNodW5rcy5leHRlbmQoYnJlYWtzKQorCisgICAgICAgICMgV2UgYXJlIGRvbmUuCisgICAgICAgIHJldHVybiBTY2FsYXJUb2tlbignJy5qb2luKGNodW5rcyksIEZhbHNlLCBzdGFydF9tYXJrLCBlbmRfbWFyaywKKyAgICAgICAgICAgICAgICBzdHlsZSkKKworICAgIGRlZiBzY2FuX2Jsb2NrX3NjYWxhcl9pbmRpY2F0b3JzKHNlbGYsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2hvbXBpbmcgPSBOb25lCisgICAgICAgIGluY3JlbWVudCA9IE5vbmUKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBpbiAnKy0nOgorICAgICAgICAgICAgaWYgY2ggPT0gJysnOgorICAgICAgICAgICAgICAgIGNob21waW5nID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjaG9tcGluZyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICAgICAgaWYgY2ggaW4gJzAxMjM0NTY3ODknOgorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IGludChjaCkKKyAgICAgICAgICAgICAgICBpZiBpbmNyZW1lbnQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGJsb2NrIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGluZGVudGF0aW9uIGluZGljYXRvciBpbiB0aGUgcmFuZ2UgMS05LCBidXQgZm91bmQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGVsaWYgY2ggaW4gJzAxMjM0NTY3ODknOgorICAgICAgICAgICAgaW5jcmVtZW50ID0gaW50KGNoKQorICAgICAgICAgICAgaWYgaW5jcmVtZW50ID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGJsb2NrIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW5kZW50YXRpb24gaW5kaWNhdG9yIGluIHRoZSByYW5nZSAxLTksIGJ1dCBmb3VuZCAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgICAgICBpZiBjaCBpbiAnKy0nOgorICAgICAgICAgICAgICAgIGlmIGNoID09ICcrJzoKKyAgICAgICAgICAgICAgICAgICAgY2hvbXBpbmcgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2hvbXBpbmcgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggbm90IGluICdcMCBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgYmxvY2sgc2NhbGFyIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGNob21waW5nIG9yIGluZGVudGF0aW9uIGluZGljYXRvcnMsIGJ1dCBmb3VuZCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICByZXR1cm4gY2hvbXBpbmcsIGluY3JlbWVudAorCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2lnbm9yZWRfbGluZShzZWxmLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIHdoaWxlIHNlbGYucGVlaygpID09ICcgJzoKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgIGlmIHNlbGYucGVlaygpID09ICcjJzoKKyAgICAgICAgICAgIHdoaWxlIHNlbGYucGVlaygpIG5vdCBpbiAnXDBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBub3QgaW4gJ1wwXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGJsb2NrIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIGNvbW1lbnQgb3IgYSBsaW5lIGJyZWFrLCBidXQgZm91bmQgJXIiICUgY2gsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgc2VsZi5zY2FuX2xpbmVfYnJlYWsoKQorCisgICAgZGVmIHNjYW5fYmxvY2tfc2NhbGFyX2luZGVudGF0aW9uKHNlbGYpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbWF4X2luZGVudCA9IDAKKyAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgaW4gJyBcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBpZiBzZWxmLnBlZWsoKSAhPSAnICc6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLnNjYW5fbGluZV9icmVhaygpKQorICAgICAgICAgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb2x1bW4gPiBtYXhfaW5kZW50OgorICAgICAgICAgICAgICAgICAgICBtYXhfaW5kZW50ID0gc2VsZi5jb2x1bW4KKyAgICAgICAgcmV0dXJuIGNodW5rcywgbWF4X2luZGVudCwgZW5kX21hcmsKKworICAgIGRlZiBzY2FuX2Jsb2NrX3NjYWxhcl9icmVha3Moc2VsZiwgaW5kZW50KToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIGVuZF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHdoaWxlIHNlbGYuY29sdW1uIDwgaW5kZW50IGFuZCBzZWxmLnBlZWsoKSA9PSAnICc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSBpbiAnXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLnNjYW5fbGluZV9icmVhaygpKQorICAgICAgICAgICAgZW5kX21hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuY29sdW1uIDwgaW5kZW50IGFuZCBzZWxmLnBlZWsoKSA9PSAnICc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgcmV0dXJuIGNodW5rcywgZW5kX21hcmsKKworICAgIGRlZiBzY2FuX2Zsb3dfc2NhbGFyKHNlbGYsIHN0eWxlKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgTm90ZSB0aGF0IHdlIGxvb3NlIGluZGVudGF0aW9uIHJ1bGVzIGZvciBxdW90ZWQgc2NhbGFycy4gUXVvdGVkCisgICAgICAgICMgc2NhbGFycyBkb24ndCBuZWVkIHRvIGFkaGVyZSBpbmRlbnRhdGlvbiBiZWNhdXNlICIgYW5kICcgY2xlYXJseQorICAgICAgICAjIG1hcmsgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGVtLiBUaGVyZWZvcmUgd2UgYXJlIGxlc3MKKyAgICAgICAgIyByZXN0cmljdGl2ZSB0aGVuIHRoZSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzLiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sKKyAgICAgICAgIyB0aGF0IGRvY3VtZW50IHNlcGFyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzY2FsYXJzLgorICAgICAgICBpZiBzdHlsZSA9PSAnIic6CisgICAgICAgICAgICBkb3VibGUgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb3VibGUgPSBGYWxzZQorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBzdGFydF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIHF1b3RlID0gc2VsZi5wZWVrKCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgY2h1bmtzLmV4dGVuZChzZWxmLnNjYW5fZmxvd19zY2FsYXJfbm9uX3NwYWNlcyhkb3VibGUsIHN0YXJ0X21hcmspKQorICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSAhPSBxdW90ZToKKyAgICAgICAgICAgIGNodW5rcy5leHRlbmQoc2VsZi5zY2FuX2Zsb3dfc2NhbGFyX3NwYWNlcyhkb3VibGUsIHN0YXJ0X21hcmspKQorICAgICAgICAgICAgY2h1bmtzLmV4dGVuZChzZWxmLnNjYW5fZmxvd19zY2FsYXJfbm9uX3NwYWNlcyhkb3VibGUsIHN0YXJ0X21hcmspKQorICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICByZXR1cm4gU2NhbGFyVG9rZW4oJycuam9pbihjaHVua3MpLCBGYWxzZSwgc3RhcnRfbWFyaywgZW5kX21hcmssCisgICAgICAgICAgICAgICAgc3R5bGUpCisKKyAgICBFU0NBUEVfUkVQTEFDRU1FTlRTID0geworICAgICAgICAnMCc6ICAgICdcMCcsCisgICAgICAgICdhJzogICAgJ1x4MDcnLAorICAgICAgICAnYic6ICAgICdceDA4JywKKyAgICAgICAgJ3QnOiAgICAnXHgwOScsCisgICAgICAgICdcdCc6ICAgJ1x4MDknLAorICAgICAgICAnbic6ICAgICdceDBBJywKKyAgICAgICAgJ3YnOiAgICAnXHgwQicsCisgICAgICAgICdmJzogICAgJ1x4MEMnLAorICAgICAgICAncic6ICAgICdceDBEJywKKyAgICAgICAgJ2UnOiAgICAnXHgxQicsCisgICAgICAgICcgJzogICAgJ1x4MjAnLAorICAgICAgICAnXCInOiAgICdcIicsCisgICAgICAgICdcXCc6ICAgJ1xcJywKKyAgICAgICAgJ04nOiAgICAnXHg4NScsCisgICAgICAgICdfJzogICAgJ1x4QTAnLAorICAgICAgICAnTCc6ICAgICdcdTIwMjgnLAorICAgICAgICAnUCc6ICAgICdcdTIwMjknLAorICAgIH0KKworICAgIEVTQ0FQRV9DT0RFUyA9IHsKKyAgICAgICAgJ3gnOiAgICAyLAorICAgICAgICAndSc6ICAgIDQsCisgICAgICAgICdVJzogICAgOCwKKyAgICB9CisKKyAgICBkZWYgc2Nhbl9mbG93X3NjYWxhcl9ub25fc3BhY2VzKHNlbGYsIGRvdWJsZSwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICAgICAgd2hpbGUgc2VsZi5wZWVrKGxlbmd0aCkgbm90IGluICdcJ1wiXFxcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgaWYgbGVuZ3RoOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5wcmVmaXgobGVuZ3RoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICAgICAgaWYgbm90IGRvdWJsZSBhbmQgY2ggPT0gJ1wnJyBhbmQgc2VsZi5wZWVrKDEpID09ICdcJyc6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgnXCcnKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgyKQorICAgICAgICAgICAgZWxpZiAoZG91YmxlIGFuZCBjaCA9PSAnXCcnKSBvciAobm90IGRvdWJsZSBhbmQgY2ggaW4gJ1wiXFwnKToKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGNoKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgpCisgICAgICAgICAgICBlbGlmIGRvdWJsZSBhbmQgY2ggPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgICAgICAgICBpZiBjaCBpbiBzZWxmLkVTQ0FQRV9SRVBMQUNFTUVOVFM6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5FU0NBUEVfUkVQTEFDRU1FTlRTW2NoXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoIGluIHNlbGYuRVNDQVBFX0NPREVTOgorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLkVTQ0FQRV9DT0RFU1tjaF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UobGVuZ3RoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGVlayhrKSBub3QgaW4gJzAxMjM0NTY3ODlBQkNERUZhYmNkZWYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSBkb3VibGUtcXVvdGVkIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZXNjYXBlIHNlcXVlbmNlIG9mICVkIGhleGRlY2ltYWwgbnVtYmVycywgYnV0IGZvdW5kICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCwgc2VsZi5wZWVrKGspKSwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gaW50KHNlbGYucHJlZml4KGxlbmd0aCksIDE2KQorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGNocihjb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgICAgICAgICBlbGlmIGNoIGluICdcclxuXHg4NVx1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmV4dGVuZChzZWxmLnNjYW5fZmxvd19zY2FsYXJfYnJlYWtzKGRvdWJsZSwgc3RhcnRfbWFyaykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhIGRvdWJsZS1xdW90ZWQgc2NhbGFyIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5rbm93biBlc2NhcGUgY2hhcmFjdGVyICVyIiAlIGNoLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3MKKworICAgIGRlZiBzY2FuX2Zsb3dfc2NhbGFyX3NwYWNlcyhzZWxmLCBkb3VibGUsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICB3aGlsZSBzZWxmLnBlZWsobGVuZ3RoKSBpbiAnIFx0JzoKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgIHdoaXRlc3BhY2VzID0gc2VsZi5wcmVmaXgobGVuZ3RoKQorICAgICAgICBzZWxmLmZvcndhcmQobGVuZ3RoKQorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoID09ICdcMCc6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgcXVvdGVkIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICJmb3VuZCB1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgIGVsaWYgY2ggaW4gJ1xyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgIGxpbmVfYnJlYWsgPSBzZWxmLnNjYW5fbGluZV9icmVhaygpCisgICAgICAgICAgICBicmVha3MgPSBzZWxmLnNjYW5fZmxvd19zY2FsYXJfYnJlYWtzKGRvdWJsZSwgc3RhcnRfbWFyaykKKyAgICAgICAgICAgIGlmIGxpbmVfYnJlYWsgIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGxpbmVfYnJlYWspCisgICAgICAgICAgICBlbGlmIG5vdCBicmVha3M6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgnICcpCisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKGJyZWFrcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQod2hpdGVzcGFjZXMpCisgICAgICAgIHJldHVybiBjaHVua3MKKworICAgIGRlZiBzY2FuX2Zsb3dfc2NhbGFyX2JyZWFrcyhzZWxmLCBkb3VibGUsIHN0YXJ0X21hcmspOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgSW5zdGVhZCBvZiBjaGVja2luZyBpbmRlbnRhdGlvbiwgd2UgY2hlY2sgZm9yIGRvY3VtZW50CisgICAgICAgICAgICAjIHNlcGFyYXRvcnMuCisgICAgICAgICAgICBwcmVmaXggPSBzZWxmLnByZWZpeCgzKQorICAgICAgICAgICAgaWYgKHByZWZpeCA9PSAnLS0tJyBvciBwcmVmaXggPT0gJy4uLicpICAgXAorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5wZWVrKDMpIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgcXVvdGVkIHNjYWxhciIsIHN0YXJ0X21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgdW5leHBlY3RlZCBkb2N1bWVudCBzZXBhcmF0b3IiLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBlZWsoKSBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgaWYgc2VsZi5wZWVrKCkgaW4gJ1xyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3MKKworICAgIGRlZiBzY2FuX3BsYWluKHNlbGYpOgorICAgICAgICAjIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICAgIyBXZSBhZGQgYW4gYWRkaXRpb25hbCByZXN0cmljdGlvbiBmb3IgdGhlIGZsb3cgY29udGV4dDoKKyAgICAgICAgIyAgIHBsYWluIHNjYWxhcnMgaW4gdGhlIGZsb3cgY29udGV4dCBjYW5ub3QgY29udGFpbiAnLCcsICc6JyBhbmQgJz8nLgorICAgICAgICAjIFdlIGFsc28ga2VlcCB0cmFjayBvZiB0aGUgYGFsbG93X3NpbXBsZV9rZXlgIGZsYWcgaGVyZS4KKyAgICAgICAgIyBJbmRlbnRhdGlvbiBydWxlcyBhcmUgbG9vc2VkIGZvciB0aGUgZmxvdyBjb250ZXh0LgorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBzdGFydF9tYXJrID0gc2VsZi5nZXRfbWFyaygpCisgICAgICAgIGVuZF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBpbmRlbnQgPSBzZWxmLmluZGVudCsxCisgICAgICAgICMgV2UgYWxsb3cgemVybyBpbmRlbnRhdGlvbiBmb3Igc2NhbGFycywgYnV0IHRoZW4gd2UgbmVlZCB0byBjaGVjayBmb3IKKyAgICAgICAgIyBkb2N1bWVudCBzZXBhcmF0b3JzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCisgICAgICAgICNpZiBpbmRlbnQgPT0gMDoKKyAgICAgICAgIyAgICBpbmRlbnQgPSAxCisgICAgICAgIHNwYWNlcyA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsZW5ndGggPSAwCisgICAgICAgICAgICBpZiBzZWxmLnBlZWsoKSA9PSAnIyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY2ggPSBzZWxmLnBlZWsobGVuZ3RoKQorICAgICAgICAgICAgICAgIGlmIGNoIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBvciAobm90IHNlbGYuZmxvd19sZXZlbCBhbmQgY2ggPT0gJzonIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBlZWsobGVuZ3RoKzEpIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JykgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3IgKHNlbGYuZmxvd19sZXZlbCBhbmQgY2ggaW4gJyw6P1tde30nKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgIyBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCBkbyB3aXRoICc6JyBpbiB0aGUgZmxvdyBjb250ZXh0LgorICAgICAgICAgICAgaWYgKHNlbGYuZmxvd19sZXZlbCBhbmQgY2ggPT0gJzonCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsobGVuZ3RoKzEpIG5vdCBpbiAnXDAgXHRcclxuXHg4NVx1MjAyOFx1MjAyOSxbXXt9Jyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgcGxhaW4gc2NhbGFyIiwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgImZvdW5kIHVuZXhwZWN0ZWQgJzonIiwgc2VsZi5nZXRfbWFyaygpLAorICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNoZWNrIGh0dHA6Ly9weXlhbWwub3JnL3dpa2kvWUFNTENvbG9uSW5GbG93Q29udGV4dCBmb3IgZGV0YWlscy4iKQorICAgICAgICAgICAgaWYgbGVuZ3RoID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IEZhbHNlCisgICAgICAgICAgICBjaHVua3MuZXh0ZW5kKHNwYWNlcykKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5wcmVmaXgobGVuZ3RoKSkKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgICAgICBlbmRfbWFyayA9IHNlbGYuZ2V0X21hcmsoKQorICAgICAgICAgICAgc3BhY2VzID0gc2VsZi5zY2FuX3BsYWluX3NwYWNlcyhpbmRlbnQsIHN0YXJ0X21hcmspCisgICAgICAgICAgICBpZiBub3Qgc3BhY2VzIG9yIHNlbGYucGVlaygpID09ICcjJyBcCisgICAgICAgICAgICAgICAgICAgIG9yIChub3Qgc2VsZi5mbG93X2xldmVsIGFuZCBzZWxmLmNvbHVtbiA8IGluZGVudCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFNjYWxhclRva2VuKCcnLmpvaW4oY2h1bmtzKSwgVHJ1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspCisKKyAgICBkZWYgc2Nhbl9wbGFpbl9zcGFjZXMoc2VsZiwgaW5kZW50LCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgVGhlIHNwZWNpZmljYXRpb24gaXMgcmVhbGx5IGNvbmZ1c2luZyBhYm91dCB0YWJzIGluIHBsYWluIHNjYWxhcnMuCisgICAgICAgICMgV2UganVzdCBmb3JiaWQgdGhlbSBjb21wbGV0ZWx5LiBEbyBub3QgdXNlIHRhYnMgaW4gWUFNTCEKKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICB3aGlsZSBzZWxmLnBlZWsobGVuZ3RoKSBpbiAnICc6CisgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICB3aGl0ZXNwYWNlcyA9IHNlbGYucHJlZml4KGxlbmd0aCkKKyAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgY2ggPSBzZWxmLnBlZWsoKQorICAgICAgICBpZiBjaCBpbiAnXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgbGluZV9icmVhayA9IHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgIHNlbGYuYWxsb3dfc2ltcGxlX2tleSA9IFRydWUKKyAgICAgICAgICAgIHByZWZpeCA9IHNlbGYucHJlZml4KDMpCisgICAgICAgICAgICBpZiAocHJlZml4ID09ICctLS0nIG9yIHByZWZpeCA9PSAnLi4uJykgICBcCisgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnBlZWsoMykgaW4gJ1wwIFx0XHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYnJlYWtzID0gW10KKyAgICAgICAgICAgIHdoaWxlIHNlbGYucGVlaygpIGluICcgXHJcblx4ODVcdTIwMjhcdTIwMjknOgorICAgICAgICAgICAgICAgIGlmIHNlbGYucGVlaygpID09ICcgJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVha3MuYXBwZW5kKHNlbGYuc2Nhbl9saW5lX2JyZWFrKCkpCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHNlbGYucHJlZml4KDMpCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gJy0tLScgb3IgcHJlZml4ID09ICcuLi4nKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5wZWVrKDMpIGluICdcMCBcdFxyXG5ceDg1XHUyMDI4XHUyMDI5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbGluZV9icmVhayAhPSAnXG4nOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQobGluZV9icmVhaykKKyAgICAgICAgICAgIGVsaWYgbm90IGJyZWFrczoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKCcgJykKKyAgICAgICAgICAgIGNodW5rcy5leHRlbmQoYnJlYWtzKQorICAgICAgICBlbGlmIHdoaXRlc3BhY2VzOgorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCh3aGl0ZXNwYWNlcykKKyAgICAgICAgcmV0dXJuIGNodW5rcworCisgICAgZGVmIHNjYW5fdGFnX2hhbmRsZShzZWxmLCBuYW1lLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgRm9yIHNvbWUgc3RyYW5nZSByZWFzb25zLCB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAnXycgaW4KKyAgICAgICAgIyB0YWcgaGFuZGxlcy4gSSBoYXZlIGFsbG93ZWQgaXQgYW55d2F5LgorICAgICAgICBjaCA9IHNlbGYucGVlaygpCisgICAgICAgIGlmIGNoICE9ICchJzoKKyAgICAgICAgICAgIHJhaXNlIFNjYW5uZXJFcnJvcigid2hpbGUgc2Nhbm5pbmcgYSAlcyIgJSBuYW1lLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJyEnLCBidXQgZm91bmQgJXIiICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgbGVuZ3RoID0gMQorICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIGlmIGNoICE9ICcgJzoKKyAgICAgICAgICAgIHdoaWxlICcwJyA8PSBjaCA8PSAnOScgb3IgJ0EnIDw9IGNoIDw9ICdaJyBvciAnYScgPD0gY2ggPD0gJ3onICBcCisgICAgICAgICAgICAgICAgICAgIG9yIGNoIGluICctXyc6CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgICAgICBpZiBjaCAhPSAnISc6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAnIScsIGJ1dCBmb3VuZCAlciIgJSBjaCwgc2VsZi5nZXRfbWFyaygpKQorICAgICAgICAgICAgbGVuZ3RoICs9IDEKKyAgICAgICAgdmFsdWUgPSBzZWxmLnByZWZpeChsZW5ndGgpCisgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIHNjYW5fdGFnX3VyaShzZWxmLCBuYW1lLCBzdGFydF9tYXJrKToKKyAgICAgICAgIyBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgICAgICAgICMgTm90ZTogd2UgZG8gbm90IGNoZWNrIGlmIFVSSSBpcyB3ZWxsLWZvcm1lZC4KKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIHdoaWxlICcwJyA8PSBjaCA8PSAnOScgb3IgJ0EnIDw9IGNoIDw9ICdaJyBvciAnYScgPD0gY2ggPD0gJ3onICBcCisgICAgICAgICAgICAgICAgb3IgY2ggaW4gJy07Lz86QCY9KyQsXy4hfipcJygpW10lJzoKKyAgICAgICAgICAgIGlmIGNoID09ICclJzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYucHJlZml4KGxlbmd0aCkpCisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKGxlbmd0aCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSAwCisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLnNjYW5fdXJpX2VzY2FwZXMobmFtZSwgc3RhcnRfbWFyaykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgICAgICBjaCA9IHNlbGYucGVlayhsZW5ndGgpCisgICAgICAgIGlmIGxlbmd0aDoKKyAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5wcmVmaXgobGVuZ3RoKSkKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsZW5ndGgpCisgICAgICAgICAgICBsZW5ndGggPSAwCisgICAgICAgIGlmIG5vdCBjaHVua3M6CisgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHBhcnNpbmcgYSAlcyIgJSBuYW1lLCBzdGFydF9tYXJrLAorICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgVVJJLCBidXQgZm91bmQgJXIiICUgY2gsIHNlbGYuZ2V0X21hcmsoKSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oY2h1bmtzKQorCisgICAgZGVmIHNjYW5fdXJpX2VzY2FwZXMoc2VsZiwgbmFtZSwgc3RhcnRfbWFyayk6CisgICAgICAgICMgU2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICBjb2RlcyA9IFtdCisgICAgICAgIG1hcmsgPSBzZWxmLmdldF9tYXJrKCkKKyAgICAgICAgd2hpbGUgc2VsZi5wZWVrKCkgPT0gJyUnOgorICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKDIpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYucGVlayhrKSBub3QgaW4gJzAxMjM0NTY3ODlBQkNERUZhYmNkZWYnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTY2FubmVyRXJyb3IoIndoaWxlIHNjYW5uaW5nIGEgJXMiICUgbmFtZSwgc3RhcnRfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgVVJJIGVzY2FwZSBzZXF1ZW5jZSBvZiAyIGhleGRlY2ltYWwgbnVtYmVycywgYnV0IGZvdW5kICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc2VsZi5wZWVrKGspLCBzZWxmLmdldF9tYXJrKCkpCisgICAgICAgICAgICBjb2Rlcy5hcHBlbmQoaW50KHNlbGYucHJlZml4KDIpLCAxNikpCisgICAgICAgICAgICBzZWxmLmZvcndhcmQoMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBieXRlcyhjb2RlcykuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgcmFpc2UgU2Nhbm5lckVycm9yKCJ3aGlsZSBzY2FubmluZyBhICVzIiAlIG5hbWUsIHN0YXJ0X21hcmssIHN0cihleGMpLCBtYXJrKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBzY2FuX2xpbmVfYnJlYWsoc2VsZik6CisgICAgICAgICMgVHJhbnNmb3JtczoKKyAgICAgICAgIyAgICdcclxuJyAgICAgIDogICAnXG4nCisgICAgICAgICMgICAnXHInICAgICAgICA6ICAgJ1xuJworICAgICAgICAjICAgJ1xuJyAgICAgICAgOiAgICdcbicKKyAgICAgICAgIyAgICdceDg1JyAgICAgIDogICAnXG4nCisgICAgICAgICMgICAnXHUyMDI4JyAgICA6ICAgJ1x1MjAyOCcKKyAgICAgICAgIyAgICdcdTIwMjkgICAgIDogICAnXHUyMDI5JworICAgICAgICAjICAgZGVmYXVsdCAgICAgOiAgICcnCisgICAgICAgIGNoID0gc2VsZi5wZWVrKCkKKyAgICAgICAgaWYgY2ggaW4gJ1xyXG5ceDg1JzoKKyAgICAgICAgICAgIGlmIHNlbGYucHJlZml4KDIpID09ICdcclxuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoMikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mb3J3YXJkKCkKKyAgICAgICAgICAgIHJldHVybiAnXG4nCisgICAgICAgIGVsaWYgY2ggaW4gJ1x1MjAyOFx1MjAyOSc6CisgICAgICAgICAgICBzZWxmLmZvcndhcmQoKQorICAgICAgICAgICAgcmV0dXJuIGNoCisgICAgICAgIHJldHVybiAnJworCisjdHJ5OgorIyAgICBpbXBvcnQgcHN5Y28KKyMgICAgcHN5Y28uYmluZChTY2FubmVyKQorI2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyMgICAgcGFzcworCmRpZmYgLS1naXQgYS9saWIzL3lhbWwvc2VyaWFsaXplci5weSBiL2xpYjMveWFtbC9zZXJpYWxpemVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTExZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIzL3lhbWwvc2VyaWFsaXplci5weQpAQCAtMCwwICsxLDExMSBAQAorCitfX2FsbF9fID0gWydTZXJpYWxpemVyJywgJ1NlcmlhbGl6ZXJFcnJvciddCisKK2Zyb20gLmVycm9yIGltcG9ydCBZQU1MRXJyb3IKK2Zyb20gLmV2ZW50cyBpbXBvcnQgKgorZnJvbSAubm9kZXMgaW1wb3J0ICoKKworY2xhc3MgU2VyaWFsaXplckVycm9yKFlBTUxFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBTZXJpYWxpemVyOgorCisgICAgQU5DSE9SX1RFTVBMQVRFID0gJ2lkJTAzZCcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgZXhwbGljaXRfc3RhcnQ9Tm9uZSwgZXhwbGljaXRfZW5kPU5vbmUsIHZlcnNpb249Tm9uZSwgdGFncz1Ob25lKToKKyAgICAgICAgc2VsZi51c2VfZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLnVzZV9leHBsaWNpdF9zdGFydCA9IGV4cGxpY2l0X3N0YXJ0CisgICAgICAgIHNlbGYudXNlX2V4cGxpY2l0X2VuZCA9IGV4cGxpY2l0X2VuZAorICAgICAgICBzZWxmLnVzZV92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLnVzZV90YWdzID0gdGFncworICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXMgPSB7fQorICAgICAgICBzZWxmLmFuY2hvcnMgPSB7fQorICAgICAgICBzZWxmLmxhc3RfYW5jaG9yX2lkID0gMAorICAgICAgICBzZWxmLmNsb3NlZCA9IE5vbmUKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KFN0cmVhbVN0YXJ0RXZlbnQoZW5jb2Rpbmc9c2VsZi51c2VfZW5jb2RpbmcpKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBlbGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKCJzZXJpYWxpemVyIGlzIGNsb3NlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgYWxyZWFkeSBvcGVuZWQiKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplckVycm9yKCJzZXJpYWxpemVyIGlzIG5vdCBvcGVuZWQiKQorICAgICAgICBlbGlmIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuZW1pdChTdHJlYW1FbmRFdmVudCgpKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICAjZGVmIF9fZGVsX18oc2VsZik6CisgICAgIyAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBzZXJpYWxpemUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgbm90IG9wZW5lZCIpCisgICAgICAgIGVsaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBTZXJpYWxpemVyRXJyb3IoInNlcmlhbGl6ZXIgaXMgY2xvc2VkIikKKyAgICAgICAgc2VsZi5lbWl0KERvY3VtZW50U3RhcnRFdmVudChleHBsaWNpdD1zZWxmLnVzZV9leHBsaWNpdF9zdGFydCwKKyAgICAgICAgICAgIHZlcnNpb249c2VsZi51c2VfdmVyc2lvbiwgdGFncz1zZWxmLnVzZV90YWdzKSkKKyAgICAgICAgc2VsZi5hbmNob3Jfbm9kZShub2RlKQorICAgICAgICBzZWxmLnNlcmlhbGl6ZV9ub2RlKG5vZGUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuZW1pdChEb2N1bWVudEVuZEV2ZW50KGV4cGxpY2l0PXNlbGYudXNlX2V4cGxpY2l0X2VuZCkpCisgICAgICAgIHNlbGYuc2VyaWFsaXplZF9ub2RlcyA9IHt9CisgICAgICAgIHNlbGYuYW5jaG9ycyA9IHt9CisgICAgICAgIHNlbGYubGFzdF9hbmNob3JfaWQgPSAwCisKKyAgICBkZWYgYW5jaG9yX25vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUgaW4gc2VsZi5hbmNob3JzOgorICAgICAgICAgICAgaWYgc2VsZi5hbmNob3JzW25vZGVdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hbmNob3JzW25vZGVdID0gc2VsZi5nZW5lcmF0ZV9hbmNob3Iobm9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yc1tub2RlXSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU2VxdWVuY2VOb2RlKToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFuY2hvcl9ub2RlKGl0ZW0pCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTWFwcGluZ05vZGUpOgorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYW5jaG9yX25vZGUoa2V5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFuY2hvcl9ub2RlKHZhbHVlKQorCisgICAgZGVmIGdlbmVyYXRlX2FuY2hvcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5sYXN0X2FuY2hvcl9pZCArPSAxCisgICAgICAgIHJldHVybiBzZWxmLkFOQ0hPUl9URU1QTEFURSAlIHNlbGYubGFzdF9hbmNob3JfaWQKKworICAgIGRlZiBzZXJpYWxpemVfbm9kZShzZWxmLCBub2RlLCBwYXJlbnQsIGluZGV4KToKKyAgICAgICAgYWxpYXMgPSBzZWxmLmFuY2hvcnNbbm9kZV0KKyAgICAgICAgaWYgbm9kZSBpbiBzZWxmLnNlcmlhbGl6ZWRfbm9kZXM6CisgICAgICAgICAgICBzZWxmLmVtaXQoQWxpYXNFdmVudChhbGlhcykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfbm9kZXNbbm9kZV0gPSBUcnVlCisgICAgICAgICAgICBzZWxmLmRlc2NlbmRfcmVzb2x2ZXIocGFyZW50LCBpbmRleCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU2NhbGFyTm9kZSk6CisgICAgICAgICAgICAgICAgZGV0ZWN0ZWRfdGFnID0gc2VsZi5yZXNvbHZlKFNjYWxhck5vZGUsIG5vZGUudmFsdWUsIChUcnVlLCBGYWxzZSkpCisgICAgICAgICAgICAgICAgZGVmYXVsdF90YWcgPSBzZWxmLnJlc29sdmUoU2NhbGFyTm9kZSwgbm9kZS52YWx1ZSwgKEZhbHNlLCBUcnVlKSkKKyAgICAgICAgICAgICAgICBpbXBsaWNpdCA9IChub2RlLnRhZyA9PSBkZXRlY3RlZF90YWcpLCAobm9kZS50YWcgPT0gZGVmYXVsdF90YWcpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFNjYWxhckV2ZW50KGFsaWFzLCBub2RlLnRhZywgaW1wbGljaXQsIG5vZGUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPW5vZGUuc3R5bGUpKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFNlcXVlbmNlTm9kZSk6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAobm9kZS50YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBzZWxmLnJlc29sdmUoU2VxdWVuY2VOb2RlLCBub2RlLnZhbHVlLCBUcnVlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoU2VxdWVuY2VTdGFydEV2ZW50KGFsaWFzLCBub2RlLnRhZywgaW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgIGZsb3dfc3R5bGU9bm9kZS5mbG93X3N0eWxlKSkKKyAgICAgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZV9ub2RlKGl0ZW0sIG5vZGUsIGluZGV4KQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KFNlcXVlbmNlRW5kRXZlbnQoKSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBNYXBwaW5nTm9kZSk6CisgICAgICAgICAgICAgICAgaW1wbGljaXQgPSAobm9kZS50YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBzZWxmLnJlc29sdmUoTWFwcGluZ05vZGUsIG5vZGUudmFsdWUsIFRydWUpKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChNYXBwaW5nU3RhcnRFdmVudChhbGlhcywgbm9kZS50YWcsIGltcGxpY2l0LAorICAgICAgICAgICAgICAgICAgICBmbG93X3N0eWxlPW5vZGUuZmxvd19zdHlsZSkpCisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVfbm9kZShrZXksIG5vZGUsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplX25vZGUodmFsdWUsIG5vZGUsIGtleSkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoTWFwcGluZ0VuZEV2ZW50KCkpCisgICAgICAgICAgICBzZWxmLmFzY2VuZF9yZXNvbHZlcigpCisKZGlmZiAtLWdpdCBhL2xpYjMveWFtbC90b2tlbnMucHkgYi9saWIzL3lhbWwvdG9rZW5zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGI0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIzL3lhbWwvdG9rZW5zLnB5CkBAIC0wLDAgKzEsMTA0IEBACisKK2NsYXNzIFRva2VuKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcmssIGVuZF9tYXJrKToKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGF0dHJpYnV0ZXMgPSBba2V5IGZvciBrZXkgaW4gc2VsZi5fX2RpY3RfXworICAgICAgICAgICAgICAgIGlmIG5vdCBrZXkuZW5kc3dpdGgoJ19tYXJrJyldCisgICAgICAgIGF0dHJpYnV0ZXMuc29ydCgpCisgICAgICAgIGFyZ3VtZW50cyA9ICcsICcuam9pbihbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGF0dHJpYnV0ZXNdKQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGFyZ3VtZW50cykKKworI2NsYXNzIEJPTVRva2VuKFRva2VuKToKKyMgICAgaWQgPSAnPGJ5dGUgb3JkZXIgbWFyaz4nCisKK2NsYXNzIERpcmVjdGl2ZVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZGlyZWN0aXZlPicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdmFsdWUsIHN0YXJ0X21hcmssIGVuZF9tYXJrKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgRG9jdW1lbnRTdGFydFRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZG9jdW1lbnQgc3RhcnQ+JworCitjbGFzcyBEb2N1bWVudEVuZFRva2VuKFRva2VuKToKKyAgICBpZCA9ICc8ZG9jdW1lbnQgZW5kPicKKworY2xhc3MgU3RyZWFtU3RhcnRUb2tlbihUb2tlbik6CisgICAgaWQgPSAnPHN0cmVhbSBzdGFydD4nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X21hcms9Tm9uZSwgZW5kX21hcms9Tm9uZSwKKyAgICAgICAgICAgIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworY2xhc3MgU3RyZWFtRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxzdHJlYW0gZW5kPicKKworY2xhc3MgQmxvY2tTZXF1ZW5jZVN0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxibG9jayBzZXF1ZW5jZSBzdGFydD4nCisKK2NsYXNzIEJsb2NrTWFwcGluZ1N0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxibG9jayBtYXBwaW5nIHN0YXJ0PicKKworY2xhc3MgQmxvY2tFbmRUb2tlbihUb2tlbik6CisgICAgaWQgPSAnPGJsb2NrIGVuZD4nCisKK2NsYXNzIEZsb3dTZXF1ZW5jZVN0YXJ0VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ1snCisKK2NsYXNzIEZsb3dNYXBwaW5nU3RhcnRUb2tlbihUb2tlbik6CisgICAgaWQgPSAneycKKworY2xhc3MgRmxvd1NlcXVlbmNlRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ10nCisKK2NsYXNzIEZsb3dNYXBwaW5nRW5kVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJ30nCisKK2NsYXNzIEtleVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc/JworCitjbGFzcyBWYWx1ZVRva2VuKFRva2VuKToKKyAgICBpZCA9ICc6JworCitjbGFzcyBCbG9ja0VudHJ5VG9rZW4oVG9rZW4pOgorICAgIGlkID0gJy0nCisKK2NsYXNzIEZsb3dFbnRyeVRva2VuKFRva2VuKToKKyAgICBpZCA9ICcsJworCitjbGFzcyBBbGlhc1Rva2VuKFRva2VuKToKKyAgICBpZCA9ICc8YWxpYXM+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgQW5jaG9yVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxhbmNob3I+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgVGFnVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzx0YWc+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgc3RhcnRfbWFyaywgZW5kX21hcmspOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFydF9tYXJrID0gc3RhcnRfbWFyaworICAgICAgICBzZWxmLmVuZF9tYXJrID0gZW5kX21hcmsKKworY2xhc3MgU2NhbGFyVG9rZW4oVG9rZW4pOgorICAgIGlkID0gJzxzY2FsYXI+JworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgcGxhaW4sIHN0YXJ0X21hcmssIGVuZF9tYXJrLCBzdHlsZT1Ob25lKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYucGxhaW4gPSBwbGFpbgorICAgICAgICBzZWxmLnN0YXJ0X21hcmsgPSBzdGFydF9tYXJrCisgICAgICAgIHNlbGYuZW5kX21hcmsgPSBlbmRfbWFyaworICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKKwpkaWZmIC0tZ2l0IGEvc2V0dXAuY2ZnIGIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjM5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXR1cC5jZmcKQEAgLTAsMCArMSwyOSBAQAorCisjIFRoZSBJTkNMVURFIGFuZCBMSUIgZGlyZWN0b3JpZXMgdG8gYnVpbGQgdGhlICdfeWFtbCcgZXh0ZW5zaW9uLgorIyBZb3UgbWF5IGFsc28gc2V0IHRoZW0gdXNpbmcgdGhlIG9wdGlvbnMgJy1JJyBhbmQgJy1MJy4KK1tidWlsZF9leHRdCisKKyMgTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yICd5YW1sLmgnIChzZXBhcmF0ZWQgYnkgJzonKS4KKyNpbmNsdWRlX2RpcnM9L3Vzci9sb2NhbC9pbmNsdWRlOi4uLy4uL2luY2x1ZGUKKworIyBMaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgJ2xpYnlhbWwuYScgKHNlcGFyYXRlZCBieSAnOicpLgorI2xpYnJhcnlfZGlycz0vdXNyL2xvY2FsL2xpYjouLi8uLi9saWIKKworIyBBbiBhbHRlcm5hdGl2ZSBjb21waWxlciB0byBidWlsZCB0aGUgZXh0ZW50aW9uLgorI2NvbXBpbGVyPW1pbmd3MzIKKworIyBBZGRpdGlvbmFsIHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBtaWdodCBiZSByZXF1aXJlZC4KKyNkZWZpbmU9WUFNTF9ERUNMQVJFX1NUQVRJQworCisjIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgdXNlZCB0byBidWlsZCBQeVlBTUwgV2luZG93cyBpbnN0YWxsZXIKKyMgZm9yIFB5dGhvbiAyLjUgb24gbXkgUEM6CisjaW5jbHVkZV9kaXJzPS4uLy4uLy4uL2xpYnlhbWwvdGFncy8wLjEuNC9pbmNsdWRlCisjbGlicmFyeV9kaXJzPS4uLy4uLy4uL2xpYnlhbWwvdGFncy8wLjEuNC93aW4zMi92czIwMDMvb3V0cHV0L3JlbGVhc2UvbGliCisjZGVmaW5lPVlBTUxfREVDTEFSRV9TVEFUSUMKKworIyBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG8gYnVpbGQgUHlZQU1MIFdpbmRvd3MgaW5zdGFsbGVyCisjIGZvciBQeXRob24gMi42LCAyLjcsIDMuMCwgMy4xIGFuZCAzLjIgb24gbXkgUEM6CisjaW5jbHVkZV9kaXJzPS4uLy4uLy4uL2xpYnlhbWwvdGFncy8wLjEuNC9pbmNsdWRlCisjbGlicmFyeV9kaXJzPS4uLy4uLy4uL2xpYnlhbWwvdGFncy8wLjEuNC93aW4zMi92czIwMDgvb3V0cHV0L3JlbGVhc2UvbGliCisjZGVmaW5lPVlBTUxfREVDTEFSRV9TVEFUSUMKKwpkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdjM2UwCi0tLSAvZGV2L251bGwKKysrIGIvc2V0dXAucHkKQEAgLTAsMCArMSwzNDUgQEAKKworTkFNRSA9ICdQeVlBTUwnCitWRVJTSU9OID0gJzMuMTEnCitERVNDUklQVElPTiA9ICJZQU1MIHBhcnNlciBhbmQgZW1pdHRlciBmb3IgUHl0aG9uIgorTE9OR19ERVNDUklQVElPTiA9ICIiIlwKK1lBTUwgaXMgYSBkYXRhIHNlcmlhbGl6YXRpb24gZm9ybWF0IGRlc2lnbmVkIGZvciBodW1hbiByZWFkYWJpbGl0eQorYW5kIGludGVyYWN0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcy4gIFB5WUFNTCBpcyBhIFlBTUwgcGFyc2VyCithbmQgZW1pdHRlciBmb3IgUHl0aG9uLgorCitQeVlBTUwgZmVhdHVyZXMgYSBjb21wbGV0ZSBZQU1MIDEuMSBwYXJzZXIsIFVuaWNvZGUgc3VwcG9ydCwgcGlja2xlCitzdXBwb3J0LCBjYXBhYmxlIGV4dGVuc2lvbiBBUEksIGFuZCBzZW5zaWJsZSBlcnJvciBtZXNzYWdlcy4gIFB5WUFNTAorc3VwcG9ydHMgc3RhbmRhcmQgWUFNTCB0YWdzIGFuZCBwcm92aWRlcyBQeXRob24tc3BlY2lmaWMgdGFncyB0aGF0CithbGxvdyB0byByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3QuCisKK1B5WUFNTCBpcyBhcHBsaWNhYmxlIGZvciBhIGJyb2FkIHJhbmdlIG9mIHRhc2tzIGZyb20gY29tcGxleAorY29uZmlndXJhdGlvbiBmaWxlcyB0byBvYmplY3Qgc2VyaWFsaXphdGlvbiBhbmQgcGVyc2lzdGFuY2UuIiIiCitBVVRIT1IgPSAiS2lyaWxsIFNpbW9ub3YiCitBVVRIT1JfRU1BSUwgPSAneGlAcmVzb2x2ZW50Lm5ldCcKK0xJQ0VOU0UgPSAiTUlUIgorUExBVEZPUk1TID0gIkFueSIKK1VSTCA9ICJodHRwOi8vcHl5YW1sLm9yZy93aWtpL1B5WUFNTCIKK0RPV05MT0FEX1VSTCA9ICJodHRwOi8vcHl5YW1sLm9yZy9kb3dubG9hZC9weXlhbWwvJXMtJXMudGFyLmd6IiAlIChOQU1FLCBWRVJTSU9OKQorQ0xBU1NJRklFUlMgPSBbCisgICAgIkRldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUiLAorICAgICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwKKyAgICAiTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UiLAorICAgICJPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50IiwKKyAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIiwKKyAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLAorICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi41IiwKKyAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsCisgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLAorICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsCisgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjAiLAorICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4xIiwKKyAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMiIsCisgICAgIlRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcyIsCisgICAgIlRvcGljIDo6IFRleHQgUHJvY2Vzc2luZyA6OiBNYXJrdXAiLAorXQorCisKK0xJQllBTUxfQ0hFQ0sgPSAiIiIKKyNpbmNsdWRlIDx5YW1sLmg+CisKK2ludCBtYWluKHZvaWQpIHsKKyAgICB5YW1sX3BhcnNlcl90IHBhcnNlcjsKKyAgICB5YW1sX2VtaXR0ZXJfdCBlbWl0dGVyOworCisgICAgeWFtbF9wYXJzZXJfaW5pdGlhbGl6ZSgmcGFyc2VyKTsKKyAgICB5YW1sX3BhcnNlcl9kZWxldGUoJnBhcnNlcik7CisKKyAgICB5YW1sX2VtaXR0ZXJfaW5pdGlhbGl6ZSgmZW1pdHRlcik7CisgICAgeWFtbF9lbWl0dGVyX2RlbGV0ZSgmZW1pdHRlcik7CisKKyAgICByZXR1cm4gMDsKK30KKyIiIgorCisKK2ltcG9ydCBzeXMsIG9zLnBhdGgKKworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbiBhcyBfRGlzdHJpYnV0aW9uCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24gYXMgX0V4dGVuc2lvbgorZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IG1rcGF0aAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0Citmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtIGFzIF9iZGlzdF9ycG0KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgQ29tcGlsZUVycm9yLCBMaW5rRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKKworaWYgJ3NldHVwdG9vbHMuZXh0ZW5zaW9uJyBpbiBzeXMubW9kdWxlczoKKyAgICBfRXh0ZW5zaW9uID0gc3lzLm1vZHVsZXNbJ3NldHVwdG9vbHMuZXh0ZW5zaW9uJ10uX0V4dGVuc2lvbgorICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29yZSddLkV4dGVuc2lvbiA9IF9FeHRlbnNpb24KKyAgICBzeXMubW9kdWxlc1snZGlzdHV0aWxzLmV4dGVuc2lvbiddLkV4dGVuc2lvbiA9IF9FeHRlbnNpb24KKyAgICBzeXMubW9kdWxlc1snZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0J10uRXh0ZW5zaW9uID0gX0V4dGVuc2lvbgorCit3aXRoX3B5cmV4ID0gTm9uZQoraWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgdHJ5OgorICAgICAgICBmcm9tIEN5dGhvbi5EaXN0dXRpbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24gYXMgX0V4dGVuc2lvbgorICAgICAgICBmcm9tIEN5dGhvbi5EaXN0dXRpbHMgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CisgICAgICAgIHdpdGhfcHlyZXggPSAnY3l0aG9uJworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQeXJleCBjYW5ub3QgYnVpbGQgX3lhbWwuYyBhdCB0aGUgbW9tZW50LAorICAgICAgICAgICAgIyBidXQgaXQgbWF5IGdldCBmaXhlZCBldmVudHVhbGx5LgorICAgICAgICAgICAgZnJvbSBQeXJleC5EaXN0dXRpbHMgaW1wb3J0IEV4dGVuc2lvbiBhcyBfRXh0ZW5zaW9uCisgICAgICAgICAgICBmcm9tIFB5cmV4LkRpc3R1dGlscyBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKKyAgICAgICAgICAgIHdpdGhfcHlyZXggPSAncHlyZXgnCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCitjbGFzcyBEaXN0cmlidXRpb24oX0Rpc3RyaWJ1dGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cnM9Tm9uZSk6CisgICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZiwgYXR0cnMpCisgICAgICAgIGlmIG5vdCBzZWxmLmV4dF9tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UobGVuKHNlbGYuZXh0X21vZHVsZXMpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICBleHQgPSBzZWxmLmV4dF9tb2R1bGVzW2lkeF0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dCwgRXh0ZW5zaW9uKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBleHQuYXR0cl9uYW1lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IFsKKyAgICAgICAgICAgICAgICAgICAgKGV4dC5vcHRpb25fbmFtZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlICVzIChkZWZhdWx0IGlmICVzIGlzIGF2YWlsYWJsZSkiCisgICAgICAgICAgICAgICAgICAgICAgICAlIChleHQuZmVhdHVyZV9kZXNjcmlwdGlvbiwgZXh0LmZlYXR1cmVfbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAoZXh0Lm5lZ19vcHRpb25fbmFtZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNsdWRlICVzIiAlIGV4dC5mZWF0dXJlX2Rlc2NyaXB0aW9uKSwKKyAgICAgICAgICAgIF0gKyBzZWxmLmdsb2JhbF9vcHRpb25zCisgICAgICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQorICAgICAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHRbZXh0Lm5lZ19vcHRpb25fbmFtZV0gPSBleHQub3B0aW9uX25hbWUKKworICAgIGRlZiBoYXNfZXh0X21vZHVsZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmV4dF9tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRfbW9kdWxlczoKKyAgICAgICAgICAgIHdpdGhfZXh0ID0gc2VsZi5leHRfc3RhdHVzKGV4dCkKKyAgICAgICAgICAgIGlmIHdpdGhfZXh0IGlzIE5vbmUgb3Igd2l0aF9leHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZXh0X3N0YXR1cyhzZWxmLCBleHQpOgorICAgICAgICBpZiAnSmF2YScgaW4gc3lzLnZlcnNpb24gb3IgJ0lyb25QeXRob24nIGluIHN5cy52ZXJzaW9uIG9yICdQeVB5JyBpbiBzeXMudmVyc2lvbjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgRXh0ZW5zaW9uKToKKyAgICAgICAgICAgIHdpdGhfZXh0ID0gZ2V0YXR0cihzZWxmLCBleHQuYXR0cl9uYW1lKQorICAgICAgICAgICAgcmV0dXJuIHdpdGhfZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCBmZWF0dXJlX25hbWUsIGZlYXR1cmVfZGVzY3JpcHRpb24sCisgICAgICAgICAgICBmZWF0dXJlX2NoZWNrLCAqKmt3ZHMpOgorICAgICAgICBpZiBub3Qgd2l0aF9weXJleDoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzb3VyY2VzWzpdOgorICAgICAgICAgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgaWYgZXh0ID09ICcucHl4JzoKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKCclcy5jJyAlIGJhc2UpCisgICAgICAgIF9FeHRlbnNpb24uX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKiprd2RzKQorICAgICAgICBzZWxmLmZlYXR1cmVfbmFtZSA9IGZlYXR1cmVfbmFtZQorICAgICAgICBzZWxmLmZlYXR1cmVfZGVzY3JpcHRpb24gPSBmZWF0dXJlX2Rlc2NyaXB0aW9uCisgICAgICAgIHNlbGYuZmVhdHVyZV9jaGVjayA9IGZlYXR1cmVfY2hlY2sKKyAgICAgICAgc2VsZi5hdHRyX25hbWUgPSAnd2l0aF8nICsgZmVhdHVyZV9uYW1lLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgIHNlbGYub3B0aW9uX25hbWUgPSAnd2l0aC0nICsgZmVhdHVyZV9uYW1lCisgICAgICAgIHNlbGYubmVnX29wdGlvbl9uYW1lID0gJ3dpdGhvdXQtJyArIGZlYXR1cmVfbmFtZQorCisKK2NsYXNzIGJ1aWxkX2V4dChfYnVpbGRfZXh0KToKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIG9wdGlvbmFsID0gVHJ1ZQorICAgICAgICBkaXNhYmxlZCA9IFRydWUKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICB3aXRoX2V4dCA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9zdGF0dXMoZXh0KQorICAgICAgICAgICAgaWYgd2l0aF9leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIHdpdGhfZXh0OgorICAgICAgICAgICAgICAgIG9wdGlvbmFsID0gRmFsc2UKKyAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZGlzYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CisgICAgICAgICAgICBleGMgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgaWYgb3B0aW9uYWw6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oc3RyKGV4YykpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oInNraXBwaW5nIGJ1aWxkX2V4dCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgZ2V0X3NvdXJjZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQorICAgICAgICBmaWxlbmFtZXMgPSBbXQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGlmIHdpdGhfcHlyZXggPT0gJ3B5cmV4JzoKKyAgICAgICAgICAgICAgICBzZWxmLnB5cmV4X3NvdXJjZXMoZXh0LnNvdXJjZXMsIGV4dCkKKyAgICAgICAgICAgIGVsaWYgd2l0aF9weXJleCA9PSAnY3l0aG9uJzoKKyAgICAgICAgICAgICAgICBzZWxmLmN5dGhvbl9zb3VyY2VzKGV4dC5zb3VyY2VzLCBleHQpCisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZXh0LnNvdXJjZXM6CisgICAgICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMF0KKyAgICAgICAgICAgICAgICBmb3IgZXh0IGluIFsnYycsICdoJywgJ3B5eCcsICdweGQnXToKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAnJXMuJXMnICUgKGJhc2UsIGV4dCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgbm90IGluIGZpbGVuYW1lcyBhbmQgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lcworCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCisgICAgICAgIG91dHB1dHMgPSBbXQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gb3V0cHV0cworCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICB3aXRoX2V4dCA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9zdGF0dXMoZXh0KQorICAgICAgICAgICAgaWYgd2l0aF9leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB3aXRoX2V4dCA9IHNlbGYuY2hlY2tfZXh0ZW5zaW9uX2F2YWlsYWJpbGl0eShleHQpCisgICAgICAgICAgICBpZiBub3Qgd2l0aF9leHQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHdpdGhfcHlyZXggPT0gJ3B5cmV4JzoKKyAgICAgICAgICAgICAgICBleHQuc291cmNlcyA9IHNlbGYucHlyZXhfc291cmNlcyhleHQuc291cmNlcywgZXh0KQorICAgICAgICAgICAgZWxpZiB3aXRoX3B5cmV4ID09ICdjeXRob24nOgorICAgICAgICAgICAgICAgIGV4dC5zb3VyY2VzID0gc2VsZi5jeXRob25fc291cmNlcyhleHQuc291cmNlcywgZXh0KQorICAgICAgICAgICAgc2VsZi5idWlsZF9leHRlbnNpb24oZXh0KQorCisgICAgZGVmIGNoZWNrX2V4dGVuc2lvbl9hdmFpbGFiaWxpdHkoc2VsZiwgZXh0KToKKyAgICAgICAgY2FjaGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAnY2hlY2tfJXMub3V0JyAlIGV4dC5mZWF0dXJlX25hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLmZvcmNlIGFuZCBvcy5wYXRoLmlzZmlsZShjYWNoZSk6CisgICAgICAgICAgICBkYXRhID0gb3BlbihjYWNoZSkucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGRhdGEgPT0gJzEnOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbGlmIGRhdGEgPT0gJzAnOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBta3BhdGgoc2VsZi5idWlsZF90ZW1wKQorICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAnY2hlY2tfJXMuYycgJSBleHQuZmVhdHVyZV9uYW1lKQorICAgICAgICBvcGVuKHNyYywgJ3cnKS53cml0ZShleHQuZmVhdHVyZV9jaGVjaykKKyAgICAgICAgbG9nLmluZm8oImNoZWNraW5nIGlmICVzIGlzIGNvbXBpbGFibGUiICUgZXh0LmZlYXR1cmVfbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgW29ial0gPSBzZWxmLmNvbXBpbGVyLmNvbXBpbGUoW3NyY10sCisgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1leHQuZGVmaW5lX21hY3JvcytbKHVuZGVmLCkgZm9yIHVuZGVmIGluIGV4dC51bmRlZl9tYWNyb3NdLAorICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9ZXh0LmluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9KGV4dC5leHRyYV9jb21waWxlX2FyZ3Mgb3IgW10pLAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzPWV4dC5kZXBlbmRzKQorICAgICAgICBleGNlcHQgQ29tcGlsZUVycm9yOgorICAgICAgICAgICAgbG9nLndhcm4oIiIpCisgICAgICAgICAgICBsb2cud2FybigiJXMgaXMgbm90IGZvdW5kIG9yIGEgY29tcGlsZXIgZXJyb3I6IGZvcmNpbmcgLS0lcyIKKyAgICAgICAgICAgICAgICAgICAgICUgKGV4dC5mZWF0dXJlX25hbWUsIGV4dC5uZWdfb3B0aW9uX25hbWUpKQorICAgICAgICAgICAgbG9nLndhcm4oIihpZiAlcyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LCB5b3UgbWF5IG5lZWQgdG8iCisgICAgICAgICAgICAgICAgICAgICUgZXh0LmZlYXR1cmVfbmFtZSkKKyAgICAgICAgICAgIGxvZy53YXJuKCIgc3BlY2lmeSB0aGUgb3B0aW9uIC0taW5jbHVkZS1kaXJzIG9yIHVuY29tbWVudCBhbmQiKQorICAgICAgICAgICAgbG9nLndhcm4oIiBtb2RpZnkgdGhlIHBhcmFtZXRlciBpbmNsdWRlX2RpcnMgaW4gc2V0dXAuY2ZnKSIpCisgICAgICAgICAgICBvcGVuKGNhY2hlLCAndycpLndyaXRlKCcwXG4nKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHByb2cgPSAnY2hlY2tfJXMnICUgZXh0LmZlYXR1cmVfbmFtZQorICAgICAgICBsb2cuaW5mbygiY2hlY2tpbmcgaWYgJXMgaXMgbGlua2FibGUiICUgZXh0LmZlYXR1cmVfbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5saW5rX2V4ZWN1dGFibGUoW29ial0sIHByb2csCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF90ZW1wLAorICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9ZXh0LmxpYnJhcmllcywKKyAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPWV4dC5saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPWV4dC5ydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9KGV4dC5leHRyYV9saW5rX2FyZ3Mgb3IgW10pKQorICAgICAgICBleGNlcHQgTGlua0Vycm9yOgorICAgICAgICAgICAgbG9nLndhcm4oIiIpCisgICAgICAgICAgICBsb2cud2FybigiJXMgaXMgbm90IGZvdW5kIG9yIGEgbGlua2VyIGVycm9yOiBmb3JjaW5nIC0tJXMiCisgICAgICAgICAgICAgICAgICAgICAlIChleHQuZmVhdHVyZV9uYW1lLCBleHQubmVnX29wdGlvbl9uYW1lKSkKKyAgICAgICAgICAgIGxvZy53YXJuKCIoaWYgJXMgaXMgaW5zdGFsbGVkIGNvcnJlY3RseSwgeW91IG1heSBuZWVkIHRvIgorICAgICAgICAgICAgICAgICAgICAlIGV4dC5mZWF0dXJlX25hbWUpCisgICAgICAgICAgICBsb2cud2FybigiIHNwZWNpZnkgdGhlIG9wdGlvbiAtLWxpYnJhcnktZGlycyBvciB1bmNvbW1lbnQgYW5kIikKKyAgICAgICAgICAgIGxvZy53YXJuKCIgbW9kaWZ5IHRoZSBwYXJhbWV0ZXIgbGlicmFyeV9kaXJzIGluIHNldHVwLmNmZykiKQorICAgICAgICAgICAgb3BlbihjYWNoZSwgJ3cnKS53cml0ZSgnMFxuJykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBvcGVuKGNhY2hlLCAndycpLndyaXRlKCcxXG4nKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIGJkaXN0X3JwbShfYmRpc3RfcnBtKToKKworICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CisgICAgICAgIGFyZ3YwID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgZmVhdHVyZXMgPSBbXQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9tb2R1bGVzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3aXRoX2V4dCA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sIGV4dC5hdHRyX25hbWUpCisgICAgICAgICAgICBpZiB3aXRoX2V4dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiB3aXRoX2V4dDoKKyAgICAgICAgICAgICAgICBmZWF0dXJlcy5hcHBlbmQoJy0tJytleHQub3B0aW9uX25hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZCgnLS0nK2V4dC5uZWdfb3B0aW9uX25hbWUpCisgICAgICAgIHN5cy5hcmd2WzBdID0gJyAnLmpvaW4oW2FyZ3YwXStmZWF0dXJlcykKKyAgICAgICAgc3BlY19maWxlID0gX2JkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBhcmd2MAorICAgICAgICByZXR1cm4gc3BlY19maWxlCisKKworY2xhc3MgdGVzdChDb21tYW5kKToKKworICAgIHVzZXJfb3B0aW9ucyA9IFtdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgYnVpbGRfY21kLnJ1bigpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBidWlsZF9jbWQuYnVpbGRfbGliKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCAndGVzdHMvbGliJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCAndGVzdHMvbGliMycpCisgICAgICAgIGltcG9ydCB0ZXN0X2FsbAorICAgICAgICB0ZXN0X2FsbC5tYWluKFtdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisKKyAgICBzZXR1cCgKKyAgICAgICAgbmFtZT1OQU1FLAorICAgICAgICB2ZXJzaW9uPVZFUlNJT04sCisgICAgICAgIGRlc2NyaXB0aW9uPURFU0NSSVBUSU9OLAorICAgICAgICBsb25nX2Rlc2NyaXB0aW9uPUxPTkdfREVTQ1JJUFRJT04sCisgICAgICAgIGF1dGhvcj1BVVRIT1IsCisgICAgICAgIGF1dGhvcl9lbWFpbD1BVVRIT1JfRU1BSUwsCisgICAgICAgIGxpY2Vuc2U9TElDRU5TRSwKKyAgICAgICAgcGxhdGZvcm1zPVBMQVRGT1JNUywKKyAgICAgICAgdXJsPVVSTCwKKyAgICAgICAgZG93bmxvYWRfdXJsPURPV05MT0FEX1VSTCwKKyAgICAgICAgY2xhc3NpZmllcnM9Q0xBU1NJRklFUlMsCisKKyAgICAgICAgcGFja2FnZV9kaXI9eycnOiB7MjogJ2xpYicsIDM6ICdsaWIzJ31bc3lzLnZlcnNpb25faW5mb1swXV19LAorICAgICAgICBwYWNrYWdlcz1bJ3lhbWwnXSwKKyAgICAgICAgZXh0X21vZHVsZXM9WworICAgICAgICAgICAgRXh0ZW5zaW9uKCdfeWFtbCcsIFsnZXh0L195YW1sLnB5eCddLAorICAgICAgICAgICAgICAgICdsaWJ5YW1sJywgIkxpYllBTUwgYmluZGluZ3MiLCBMSUJZQU1MX0NIRUNLLAorICAgICAgICAgICAgICAgIGxpYnJhcmllcz1bJ3lhbWwnXSksCisgICAgICAgIF0sCisKKyAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbiwKKworICAgICAgICBjbWRjbGFzcz17CisgICAgICAgICAgICAnYnVpbGRfZXh0JzogYnVpbGRfZXh0LAorICAgICAgICAgICAgJ2JkaXN0X3JwbSc6IGJkaXN0X3JwbSwKKyAgICAgICAgICAgICd0ZXN0JzogdGVzdCwKKyAgICAgICAgfSwKKyAgICApCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvYS1uYXN0eS1saWJ5YW1sLWJ1Zy5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2EtbmFzdHktbGlieWFtbC1idWcubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2Q0OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2EtbmFzdHktbGlieWFtbC1idWcubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKK1sgWwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvYWxpYXNlcy1jZHVtcGVyLWJ1Zy5jb2RlIGIvdGVzdHMvZGF0YS9hbGlhc2VzLWNkdW1wZXItYnVnLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2ODQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvYWxpYXNlcy1jZHVtcGVyLWJ1Zy5jb2RlCkBAIC0wLDAgKzEgQEAKK1sgdG9kYXksIHRvZGF5IF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvYWxpYXNlcy5ldmVudHMgYi90ZXN0cy9kYXRhL2FsaWFzZXMuZXZlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzliNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2FsaWFzZXMuZXZlbnRzCkBAIC0wLDAgKzEsOCBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIURvY3VtZW50U3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNjYWxhciB7IGFuY2hvcjogJ215YW5jaG9yJywgdGFnOiAnIW15dGFnJywgdmFsdWU6ICdkYXRhJyB9CistICFBbGlhcyB7IGFuY2hvcjogJ215YW5jaG9yJyB9CistICFTZXF1ZW5jZUVuZAorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9ib29sLmRhdGEgYi90ZXN0cy9kYXRhL2Jvb2wuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg4YjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9ib29sLmRhdGEKQEAgLTAsMCArMSw0IEBACistIHllcworLSBOTworLSBUcnVlCistIG9uCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2Jvb2wuZGV0ZWN0IGIvdGVzdHMvZGF0YS9ib29sLmRldGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdlYmJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9ib29sLmRldGVjdApAQCAtMCwwICsxIEBACit0YWc6eWFtbC5vcmcsMjAwMjpib29sCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbG9uLWluLWZsb3ctY29udGV4dC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2NvbG9uLWluLWZsb3ctY29udGV4dC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNTA4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29sb24taW4tZmxvdy1jb250ZXh0LmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACit7IGZvbzpiYXIgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5Mi5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5Mi5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWMwZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1iaW5hcnktcHkyLmNvZGUKQEAgLTAsMCArMSw3IEBACit7CisgICAgImNhbm9uaWNhbCI6CisgICAgICAgICJHSUY4OWFceDBjXHgwMFx4MGNceDAwXHg4NFx4MDBceDAwXHhmZlx4ZmZceGY3XHhmNVx4ZjVceGVlXHhlOVx4ZTlceGU1ZmZmXHgwMFx4MDBceDAwXHhlN1x4ZTdceGU3Xl5eXHhmM1x4ZjNceGVkXHg4ZVx4OGVceDhlXHhlMFx4ZTBceGUwXHg5Zlx4OWZceDlmXHg5M1x4OTNceDkzXHhhN1x4YTdceGE3XHg5ZVx4OWVceDllaWlpY2NjXHhhM1x4YTNceGEzXHg4NFx4ODRceDg0XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5IVx4ZmVceDBlTWFkZSB3aXRoIEdJTVBceDAwLFx4MDBceDAwXHgwMFx4MDBceDBjXHgwMFx4MGNceDAwXHgwMFx4MDUsICBceDhlXHg4MTBceDllXHhlM0BceDE0XHhlOGlceDEwXHhjNFx4ZDFceDhhXHgwOFx4MWNceGNmXHg4ME0kelx4ZWZceGZmMFx4ODVwXHhiOFx4YjAxZlxyXHgxYlx4Y2VceDAxXHhjM1x4MDFceDFlXHgxMCcgXHg4MlxuXHgwMVx4MDA7IiwKKyAgICAiZ2VuZXJpYyI6CisgICAgICAgICJHSUY4OWFceDBjXHgwMFx4MGNceDAwXHg4NFx4MDBceDAwXHhmZlx4ZmZceGY3XHhmNVx4ZjVceGVlXHhlOVx4ZTlceGU1ZmZmXHgwMFx4MDBceDAwXHhlN1x4ZTdceGU3Xl5eXHhmM1x4ZjNceGVkXHg4ZVx4OGVceDhlXHhlMFx4ZTBceGUwXHg5Zlx4OWZceDlmXHg5M1x4OTNceDkzXHhhN1x4YTdceGE3XHg5ZVx4OWVceDllaWlpY2NjXHhhM1x4YTNceGEzXHg4NFx4ODRceDg0XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5XHhmZlx4ZmVceGY5IVx4ZmVceDBlTWFkZSB3aXRoIEdJTVBceDAwLFx4MDBceDAwXHgwMFx4MDBceDBjXHgwMFx4MGNceDAwXHgwMFx4MDUsICBceDhlXHg4MTBceDllXHhlM0BceDE0XHhlOGlceDEwXHhjNFx4ZDFceDhhXHgwOFx4MWNceGNmXHg4ME0kelx4ZWZceGZmMFx4ODVwXHhiOFx4YjAxZlxyXHgxYlx4Y2VceDAxXHhjM1x4MDFceDFlXHgxMCcgXHg4MlxuXHgwMVx4MDA7IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGJpbmFyeSB2YWx1ZSBhYm92ZSBpcyBhIHRpbnkgYXJyb3cgZW5jb2RlZCBhcyBhIGdpZiBpbWFnZS4iLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5Mi5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5Mi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGIxNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1iaW5hcnktcHkyLmRhdGEKQEAgLTAsMCArMSwxMiBAQAorY2Fub25pY2FsOiAhIWJpbmFyeSAiXAorIFIwbEdPRGxoREFBTUFJUUFBUC8vOS9YMTd1bnA1V1ptWmdBQUFPZm41MTVlWHZQejdZNk9qdURnNEorZm41XAorIE9UazZlbnA1NmVubWxwYVdOalk2T2pvNFNFaFAvKytmLysrZi8rK2YvKytmLysrZi8rK2YvKytmLysrZi8rXAorICtmLysrZi8rK2YvKytmLysrZi8rK1NIK0RrMWhaR1VnZDJsMGFDQkhTVTFRQUN3QUFBQUFEQUFNQUFBRkxDXAorIEFnam9Fd251TkFGT2hwRU1UUmlnZ2N6NEJOSkhydi96Q0ZjTGl3TVdZTkc4NEJ3d0VlRUNjZ2dnb0JBRHM9IgorZ2VuZXJpYzogISFiaW5hcnkgfAorIFIwbEdPRGxoREFBTUFJUUFBUC8vOS9YMTd1bnA1V1ptWmdBQUFPZm41MTVlWHZQejdZNk9qdURnNEorZm41CisgT1RrNmVucDU2ZW5tbHBhV05qWTZPam80U0VoUC8rK2YvKytmLysrZi8rK2YvKytmLysrZi8rK2YvKytmLysKKyArZi8rK2YvKytmLysrZi8rK2YvKytTSCtEazFoWkdVZ2QybDBhQ0JIU1UxUUFDd0FBQUFBREFBTUFBQUZMQworIEFnam9Fd251TkFGT2hwRU1UUmlnZ2N6NEJOSkhydi96Q0ZjTGl3TVdZTkc4NEJ3d0VlRUNjZ2dnb0JBRHM9CitkZXNjcmlwdGlvbjoKKyBUaGUgYmluYXJ5IHZhbHVlIGFib3ZlIGlzIGEgdGlueSBhcnJvdyBlbmNvZGVkIGFzIGEgZ2lmIGltYWdlLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5My5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtYmluYXJ5LXB5My5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmZjM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1iaW5hcnktcHkzLmNvZGUKQEAgLTAsMCArMSw3IEBACit7CisgICAgImNhbm9uaWNhbCI6CisgICAgICAgIGIiR0lGODlhXHgwY1x4MDBceDBjXHgwMFx4ODRceDAwXHgwMFx4ZmZceGZmXHhmN1x4ZjVceGY1XHhlZVx4ZTlceGU5XHhlNWZmZlx4MDBceDAwXHgwMFx4ZTdceGU3XHhlN15eXlx4ZjNceGYzXHhlZFx4OGVceDhlXHg4ZVx4ZTBceGUwXHhlMFx4OWZceDlmXHg5Zlx4OTNceDkzXHg5M1x4YTdceGE3XHhhN1x4OWVceDllXHg5ZWlpaWNjY1x4YTNceGEzXHhhM1x4ODRceDg0XHg4NFx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOVx4ZmZceGZlXHhmOSFceGZlXHgwZU1hZGUgd2l0aCBHSU1QXHgwMCxceDAwXHgwMFx4MDBceDAwXHgwY1x4MDBceDBjXHgwMFx4MDBceDA1LCAgXHg4ZVx4ODEwXHg5ZVx4ZTNAXHgxNFx4ZThpXHgxMFx4YzRceGQxXHg4YVx4MDhceDFjXHhjZlx4ODBNJHpceGVmXHhmZjBceDg1cFx4YjhceGIwMWZcclx4MWJceGNlXHgwMVx4YzNceDAxXHgxZVx4MTAnIFx4ODJcblx4MDFceDAwOyIsCisgICAgImdlbmVyaWMiOgorICAgICAgICBiIkdJRjg5YVx4MGNceDAwXHgwY1x4MDBceDg0XHgwMFx4MDBceGZmXHhmZlx4ZjdceGY1XHhmNVx4ZWVceGU5XHhlOVx4ZTVmZmZceDAwXHgwMFx4MDBceGU3XHhlN1x4ZTdeXl5ceGYzXHhmM1x4ZWRceDhlXHg4ZVx4OGVceGUwXHhlMFx4ZTBceDlmXHg5Zlx4OWZceDkzXHg5M1x4OTNceGE3XHhhN1x4YTdceDllXHg5ZVx4OWVpaWljY2NceGEzXHhhM1x4YTNceDg0XHg4NFx4ODRceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjlceGZmXHhmZVx4ZjkhXHhmZVx4MGVNYWRlIHdpdGggR0lNUFx4MDAsXHgwMFx4MDBceDAwXHgwMFx4MGNceDAwXHgwY1x4MDBceDAwXHgwNSwgIFx4OGVceDgxMFx4OWVceGUzQFx4MTRceGU4aVx4MTBceGM0XHhkMVx4OGFceDA4XHgxY1x4Y2ZceDgwTSR6XHhlZlx4ZmYwXHg4NXBceGI4XHhiMDFmXHJceDFiXHhjZVx4MDFceGMzXHgwMVx4MWVceDEwJyBceDgyXG5ceDAxXHgwMDsiLAorICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgYmluYXJ5IHZhbHVlIGFib3ZlIGlzIGEgdGlueSBhcnJvdyBlbmNvZGVkIGFzIGEgZ2lmIGltYWdlLiIsCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1iaW5hcnktcHkzLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1iaW5hcnktcHkzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYjE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LWJpbmFyeS1weTMuZGF0YQpAQCAtMCwwICsxLDEyIEBACitjYW5vbmljYWw6ICEhYmluYXJ5ICJcCisgUjBsR09EbGhEQUFNQUlRQUFQLy85L1gxN3VucDVXWm1aZ0FBQU9mbjUxNWVYdlB6N1k2T2p1RGc0SitmbjVcCisgT1RrNmVucDU2ZW5tbHBhV05qWTZPam80U0VoUC8rK2YvKytmLysrZi8rK2YvKytmLysrZi8rK2YvKytmLytcCisgK2YvKytmLysrZi8rK2YvKytmLysrU0grRGsxaFpHVWdkMmwwYUNCSFNVMVFBQ3dBQUFBQURBQU1BQUFGTENcCisgQWdqb0V3bnVOQUZPaHBFTVRSaWdnY3o0Qk5KSHJ2L3pDRmNMaXdNV1lORzg0Qnd3RWVFQ2NnZ2dvQkFEcz0iCitnZW5lcmljOiAhIWJpbmFyeSB8CisgUjBsR09EbGhEQUFNQUlRQUFQLy85L1gxN3VucDVXWm1aZ0FBQU9mbjUxNWVYdlB6N1k2T2p1RGc0SitmbjUKKyBPVGs2ZW5wNTZlbm1scGFXTmpZNk9qbzRTRWhQLysrZi8rK2YvKytmLysrZi8rK2YvKytmLysrZi8rK2YvKworICtmLysrZi8rK2YvKytmLysrZi8rK1NIK0RrMWhaR1VnZDJsMGFDQkhTVTFRQUN3QUFBQUFEQUFNQUFBRkxDCisgQWdqb0V3bnVOQUZPaHBFTVRSaWdnY3o0Qk5KSHJ2L3pDRmNMaXdNV1lORzg0Qnd3RWVFQ2NnZ2dvQkFEcz0KK2Rlc2NyaXB0aW9uOgorIFRoZSBiaW5hcnkgdmFsdWUgYWJvdmUgaXMgYSB0aW55IGFycm93IGVuY29kZWQgYXMgYSBnaWYgaW1hZ2UuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1ib29sLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1ib29sLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwMjU4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LWJvb2wuY29kZQpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICAiY2Fub25pY2FsIjogVHJ1ZSwKKyAgICAiYW5zd2VyIjogRmFsc2UsCisgICAgImxvZ2ljYWwiOiBUcnVlLAorICAgICJvcHRpb24iOiBUcnVlLAorICAgICJidXQiOiB7ICJ5IjogImlzIGEgc3RyaW5nIiwgIm4iOiAiaXMgYSBzdHJpbmciIH0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1ib29sLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1ib29sLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNjUxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LWJvb2wuZGF0YQpAQCAtMCwwICsxLDkgQEAKK2Nhbm9uaWNhbDogeWVzCithbnN3ZXI6IE5PCitsb2dpY2FsOiBUcnVlCitvcHRpb246IG9uCisKKworYnV0OgorICAgIHk6IGlzIGEgc3RyaW5nCisgICAgbjogaXMgYSBzdHJpbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LWN1c3RvbS5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtY3VzdG9tLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1ZjA2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LWN1c3RvbS5jb2RlCkBAIC0wLDAgKzEsMTAgQEAKK1sKKyAgICBNeVRlc3RDbGFzczEoeD0xKSwKKyAgICBNeVRlc3RDbGFzczEoeD0xLCB5PTIsIHo9MyksCisgICAgTXlUZXN0Q2xhc3MyKHg9MTApLAorICAgIE15VGVzdENsYXNzMih4PTEwLCB5PTIwLCB6PTMwKSwKKyAgICBNeVRlc3RDbGFzczMoeD0xKSwKKyAgICBNeVRlc3RDbGFzczMoeD0xLCB5PTIsIHo9MyksCisgICAgTXlUZXN0Q2xhc3MzKHg9MSwgeT0yLCB6PTMpLAorICAgIFlBTUxPYmplY3QxKG15X3BhcmFtZXRlcj0nZm9vJywgbXlfYW5vdGhlcl9wYXJhbWV0ZXI9WzEsMiwzXSkKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LWN1c3RvbS5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtY3VzdG9tLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMGY2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LWN1c3RvbS5kYXRhCkBAIC0wLDAgKzEsMjYgQEAKKy0tLQorLSAhdGFnMQorICB4OiAxCistICF0YWcxCisgIHg6IDEKKyAgJ3knOiAyCisgIHo6IDMKKy0gIXRhZzIKKyAgMTAKKy0gIXRhZzIKKyAgPTogMTAKKyAgJ3knOiAyMAorICB6OiAzMAorLSAhdGFnMworICB4OiAxCistICF0YWczCisgIHg6IDEKKyAgJ3knOiAyCisgIHo6IDMKKy0gIXRhZzMKKyAgPTogMQorICAneSc6IDIKKyAgejogMworLSAhZm9vCisgIG15LXBhcmFtZXRlcjogZm9vCisgIG15LWFub3RoZXItcGFyYW1ldGVyOiBbMSwyLDNdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1mbG9hdC5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtZmxvYXQuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkzYmYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtZmxvYXQuY29kZQpAQCAtMCwwICsxLDggQEAKK3sKKyAgICAiY2Fub25pY2FsIjogNjg1MjMwLjE1LAorICAgICJleHBvbmVudGlhbCI6IDY4NTIzMC4xNSwKKyAgICAiZml4ZWQiOiA2ODUyMzAuMTUsCisgICAgInNleGFnZXNpbWFsIjogNjg1MjMwLjE1LAorICAgICJuZWdhdGl2ZSBpbmZpbml0eSI6IC0xZTMwMDAwMCwKKyAgICAibm90IGEgbnVtYmVyIjogMWUzMDAwMDAvMWUzMDAwMDAsCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1mbG9hdC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtZmxvYXQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYyYzYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtZmxvYXQuZGF0YQpAQCAtMCwwICsxLDYgQEAKK2Nhbm9uaWNhbDogNi44NTIzMDE1ZSs1CitleHBvbmVudGlhbDogNjg1LjIzMF8xNWUrMDMKK2ZpeGVkOiA2ODVfMjMwLjE1CitzZXhhZ2VzaW1hbDogMTkwOjIwOjMwLjE1CituZWdhdGl2ZSBpbmZpbml0eTogLS5pbmYKK25vdCBhIG51bWJlcjogLk5hTgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtaW50LmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1pbnQuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU4ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtaW50LmNvZGUKQEAgLTAsMCArMSw4IEBACit7CisgICAgImNhbm9uaWNhbCI6IDY4NTIzMCwKKyAgICAiZGVjaW1hbCI6IDY4NTIzMCwKKyAgICAib2N0YWwiOiA2ODUyMzAsCisgICAgImhleGFkZWNpbWFsIjogNjg1MjMwLAorICAgICJiaW5hcnkiOiA2ODUyMzAsCisgICAgInNleGFnZXNpbWFsIjogNjg1MjMwLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtaW50LmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1pbnQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJjMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtaW50LmRhdGEKQEAgLTAsMCArMSw2IEBACitjYW5vbmljYWw6IDY4NTIzMAorZGVjaW1hbDogKzY4NV8yMzAKK29jdGFsOiAwMjQ3MjI1NgoraGV4YWRlY2ltYWw6IDB4XzBBXzc0X0FFCitiaW5hcnk6IDBiMTAxMF8wMTExXzAxMDBfMTAxMF8xMTEwCitzZXhhZ2VzaW1hbDogMTkwOjIwOjMwCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1tYXAuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW1hcC5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmJhNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1tYXAuY29kZQpAQCAtMCwwICsxLDYgQEAKK3sKKyAgICAiQmxvY2sgc3R5bGUiOgorICAgICAgICB7ICJDbGFyayIgOiAiRXZhbnMiLCAiQnJpYW4iIDogIkluZ2Vyc29uIiwgIk9yZW4iIDogIkJlbi1LaWtpIiB9LAorICAgICJGbG93IHN0eWxlIjoKKyAgICAgICAgeyAiQ2xhcmsiIDogIkV2YW5zIiwgIkJyaWFuIiA6ICJJbmdlcnNvbiIsICJPcmVuIiA6ICJCZW4tS2lraSIgfSwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LW1hcC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtbWFwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW1hcC5kYXRhCkBAIC0wLDAgKzEsNiBAQAorIyBVbm9yZGVyZWQgc2V0IG9mIGtleTogdmFsdWUgcGFpcnMuCitCbG9jayBzdHlsZTogISFtYXAKKyAgQ2xhcmsgOiBFdmFucworICBCcmlhbiA6IEluZ2Vyc29uCisgIE9yZW4gIDogQmVuLUtpa2kKK0Zsb3cgc3R5bGU6ICEhbWFwIHsgQ2xhcms6IEV2YW5zLCBCcmlhbjogSW5nZXJzb24sIE9yZW46IEJlbi1LaWtpIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LW1lcmdlLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1tZXJnZS5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDQxOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1tZXJnZS5jb2RlCkBAIC0wLDAgKzEsMTAgQEAKK1sKKyAgICB7ICJ4IjogMSwgInkiOiAyIH0sCisgICAgeyAieCI6IDAsICJ5IjogMiB9LAorICAgIHsgInIiOiAxMCB9LAorICAgIHsgInIiOiAxIH0sCisgICAgeyAieCI6IDEsICJ5IjogMiwgInIiOiAxMCwgImxhYmVsIjogImNlbnRlci9iaWciIH0sCisgICAgeyAieCI6IDEsICJ5IjogMiwgInIiOiAxMCwgImxhYmVsIjogImNlbnRlci9iaWciIH0sCisgICAgeyAieCI6IDEsICJ5IjogMiwgInIiOiAxMCwgImxhYmVsIjogImNlbnRlci9iaWciIH0sCisgICAgeyAieCI6IDEsICJ5IjogMiwgInIiOiAxMCwgImxhYmVsIjogImNlbnRlci9iaWciIH0sCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1tZXJnZS5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtbWVyZ2UuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRiMmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtbWVyZ2UuZGF0YQpAQCAtMCwwICsxLDI3IEBACistLS0KKy0gJkNFTlRFUiB7IHg6IDEsICd5JzogMiB9CistICZMRUZUIHsgeDogMCwgJ3knOiAyIH0KKy0gJkJJRyB7IHI6IDEwIH0KKy0gJlNNQUxMIHsgcjogMSB9CisKKyMgQWxsIHRoZSBmb2xsb3dpbmcgbWFwcyBhcmUgZXF1YWw6CisKKy0gIyBFeHBsaWNpdCBrZXlzCisgIHg6IDEKKyAgJ3knOiAyCisgIHI6IDEwCisgIGxhYmVsOiBjZW50ZXIvYmlnCisKKy0gIyBNZXJnZSBvbmUgbWFwCisgIDw8IDogKkNFTlRFUgorICByOiAxMAorICBsYWJlbDogY2VudGVyL2JpZworCistICMgTWVyZ2UgbXVsdGlwbGUgbWFwcworICA8PCA6IFsgKkNFTlRFUiwgKkJJRyBdCisgIGxhYmVsOiBjZW50ZXIvYmlnCisKKy0gIyBPdmVycmlkZQorICA8PCA6IFsgKkJJRywgKkxFRlQsICpTTUFMTCBdCisgIHg6IDEKKyAgbGFiZWw6IGNlbnRlci9iaWcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LW51bGwuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW51bGwuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk1ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtbnVsbC5jb2RlCkBAIC0wLDAgKzEsMTMgQEAKK1sKKyAgICBOb25lLAorICAgIHsgImVtcHR5IjogTm9uZSwgImNhbm9uaWNhbCI6IE5vbmUsICJlbmdsaXNoIjogTm9uZSwgTm9uZTogIm51bGwga2V5IiB9LAorICAgIHsKKyAgICAgICAgInNwYXJzZSI6IFsKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAiMm5kIGVudHJ5IiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAiNHRoIGVudHJ5IiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgIF0sCisgICAgfSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LW51bGwuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW51bGwuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQwMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtbnVsbC5kYXRhCkBAIC0wLDAgKzEsMTggQEAKKyMgQSBkb2N1bWVudCBtYXkgYmUgbnVsbC4KKy0tLQorLS0tCisjIFRoaXMgbWFwcGluZyBoYXMgZm91ciBrZXlzLAorIyBvbmUgaGFzIGEgdmFsdWUuCitlbXB0eToKK2Nhbm9uaWNhbDogfgorZW5nbGlzaDogbnVsbAorfjogbnVsbCBrZXkKKy0tLQorIyBUaGlzIHNlcXVlbmNlIGhhcyBmaXZlCisjIGVudHJpZXMsIHR3byBoYXZlIHZhbHVlcy4KK3NwYXJzZToKKyAgLSB+CisgIC0gMm5kIGVudHJ5CisgIC0KKyAgLSA0dGggZW50cnkKKyAgLSBOdWxsCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1vbWFwLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1vbWFwLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZjFiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW9tYXAuY29kZQpAQCAtMCwwICsxLDggQEAKK3sKKyAgICAiQmVzdGlhcnkiOiBbCisgICAgICAgICgiYWFyZHZhcmsiLCAiQWZyaWNhbiBwaWctbGlrZSBhbnQgZWF0ZXIuIFVnbHkuIiksCisgICAgICAgICgiYW50ZWF0ZXIiLCAiU291dGgtQW1lcmljYW4gYW50IGVhdGVyLiBUd28gc3BlY2llcy4iKSwKKyAgICAgICAgKCJhbmFjb25kYSIsICJTb3V0aC1BbWVyaWNhbiBjb25zdHJpY3RvciBzbmFrZS4gU2NhbHkuIiksCisgICAgXSwKKyAgICAiTnVtYmVycyI6IFsgKCJvbmUiLCAxKSwgKCJ0d28iLCAyKSwgKCJ0aHJlZSIsIDMpIF0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1vbWFwLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1vbWFwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMGY0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LW9tYXAuZGF0YQpAQCAtMCwwICsxLDggQEAKKyMgRXhwbGljaXRseSB0eXBlZCBvcmRlcmVkIG1hcCAoZGljdGlvbmFyeSkuCitCZXN0aWFyeTogISFvbWFwCisgIC0gYWFyZHZhcms6IEFmcmljYW4gcGlnLWxpa2UgYW50IGVhdGVyLiBVZ2x5LgorICAtIGFudGVhdGVyOiBTb3V0aC1BbWVyaWNhbiBhbnQgZWF0ZXIuIFR3byBzcGVjaWVzLgorICAtIGFuYWNvbmRhOiBTb3V0aC1BbWVyaWNhbiBjb25zdHJpY3RvciBzbmFrZS4gU2NhbHkuCisgICMgRXRjLgorIyBGbG93IHN0eWxlCitOdW1iZXJzOiAhIW9tYXAgWyBvbmU6IDEsIHR3bzogMiwgdGhyZWUgOiAzIF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXBhaXJzLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1wYWlycy5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Zjg2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1wYWlycy5jb2RlCkBAIC0wLDAgKzEsOSBAQAoreworICAgICJCbG9jayB0YXNrcyI6IFsKKyAgICAgICAgKCJtZWV0aW5nIiwgIndpdGggdGVhbS4iKSwKKyAgICAgICAgKCJtZWV0aW5nIiwgIndpdGggYm9zcy4iKSwKKyAgICAgICAgKCJicmVhayIsICJsdW5jaC4iKSwKKyAgICAgICAgKCJtZWV0aW5nIiwgIndpdGggY2xpZW50LiIpLAorICAgIF0sCisgICAgIkZsb3cgdGFza3MiOiBbICgibWVldGluZyIsICJ3aXRoIHRlYW0iKSwgKCJtZWV0aW5nIiwgIndpdGggYm9zcyIpIF0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1wYWlycy5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcGFpcnMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY1NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcGFpcnMuZGF0YQpAQCAtMCwwICsxLDcgQEAKKyMgRXhwbGljaXRseSB0eXBlZCBwYWlycy4KK0Jsb2NrIHRhc2tzOiAhIXBhaXJzCisgIC0gbWVldGluZzogd2l0aCB0ZWFtLgorICAtIG1lZXRpbmc6IHdpdGggYm9zcy4KKyAgLSBicmVhazogbHVuY2guCisgIC0gbWVldGluZzogd2l0aCBjbGllbnQuCitGbG93IHRhc2tzOiAhIXBhaXJzIFsgbWVldGluZzogd2l0aCB0ZWFtLCBtZWV0aW5nOiB3aXRoIGJvc3MgXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWJvb2wuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ib29sLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwZGEwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ib29sLmNvZGUKQEAgLTAsMCArMSBAQAorWyBUcnVlLCBGYWxzZSBdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tYm9vbC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWJvb2wuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY4ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWJvb2wuZGF0YQpAQCAtMCwwICsxIEBACitbICEhcHl0aG9uL2Jvb2wgVHJ1ZSwgISFweXRob24vYm9vbCBGYWxzZSBdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tYnl0ZXMtcHkzLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tYnl0ZXMtcHkzLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwNTFkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ieXRlcy1weTMuY29kZQpAQCAtMCwwICsxIEBACitiJ3NvbWUgYmluYXJ5IGRhdGEnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tYnl0ZXMtcHkzLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tYnl0ZXMtcHkzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyODcyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ieXRlcy1weTMuZGF0YQpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vYnl0ZXMgJ2MyOXRaU0JpYVc1aGNua2daR0YwWVE9PScKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1jb21wbGV4LmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tY29tcGxleC5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODJkZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tY29tcGxleC5jb2RlCkBAIC0wLDAgKzEgQEAKK1swLjUrMGosIDAuNSswLjVqLCAwLjVqLCAtMC41KzAuNWosIC0wLjUrMGosIC0wLjUtMC41aiwgLTAuNWosIDAuNS0wLjVqXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWNvbXBsZXguZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1jb21wbGV4LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlYmFkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1jb21wbGV4LmRhdGEKQEAgLTAsMCArMSw4IEBACistICEhcHl0aG9uL2NvbXBsZXggMC41KzBqCistICEhcHl0aG9uL2NvbXBsZXggMC41KzAuNWoKKy0gISFweXRob24vY29tcGxleCAwLjVqCistICEhcHl0aG9uL2NvbXBsZXggLTAuNSswLjVqCistICEhcHl0aG9uL2NvbXBsZXggLTAuNSswagorLSAhIXB5dGhvbi9jb21wbGV4IC0wLjUtMC41agorLSAhIXB5dGhvbi9jb21wbGV4IC0wLjVqCistICEhcHl0aG9uL2NvbXBsZXggMC41LTAuNWoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1mbG9hdC5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWZsb2F0LmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5MTBhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1mbG9hdC5jb2RlCkBAIC0wLDAgKzEgQEAKKzEyMy40NTYKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1mbG9hdC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWZsb2F0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2MGViOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1mbG9hdC5kYXRhCkBAIC0wLDAgKzEgQEAKKyEhcHl0aG9uL2Zsb2F0IDEyMy40NTYKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1pbnQuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1pbnQuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBhMTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWludC5jb2RlCkBAIC0wLDAgKzEgQEAKKzEyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWludC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWludC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MWQ2NjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24taW50LmRhdGEKQEAgLTAsMCArMSBAQAorISFweXRob24vaW50IDEyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkyLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbG9uZy1zaG9ydC1weTIuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWZjM2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkyLmNvZGUKQEAgLTAsMCArMSBAQAorMTIzTApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkyLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbG9uZy1zaG9ydC1weTIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ1ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkyLmRhdGEKQEAgLTAsMCArMSBAQAorISFweXRob24vbG9uZyAxMjMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1sb25nLXNob3J0LXB5My5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkzLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwYTE4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1sb25nLXNob3J0LXB5My5jb2RlCkBAIC0wLDAgKzEgQEAKKzEyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkzLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbG9uZy1zaG9ydC1weTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ1ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLWxvbmctc2hvcnQtcHkzLmRhdGEKQEAgLTAsMCArMSBAQAorISFweXRob24vbG9uZyAxMjMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1uYW1lLW1vZHVsZS5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLW5hbWUtbW9kdWxlLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzOTE0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1uYW1lLW1vZHVsZS5jb2RlCkBAIC0wLDAgKzEgQEAKK1tzdHIsIHlhbWwuTG9hZGVyLCB5YW1sLmR1bXAsIGFicywgeWFtbC50b2tlbnNdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbmFtZS1tb2R1bGUuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1uYW1lLW1vZHVsZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzk3MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbmFtZS1tb2R1bGUuZGF0YQpAQCAtMCwwICsxLDUgQEAKKy0gISFweXRob24vbmFtZTpzdHIKKy0gISFweXRob24vbmFtZTp5YW1sLkxvYWRlcgorLSAhIXB5dGhvbi9uYW1lOnlhbWwuZHVtcAorLSAhIXB5dGhvbi9uYW1lOmFicworLSAhIXB5dGhvbi9tb2R1bGU6eWFtbC50b2tlbnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ub25lLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbm9uZS5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDQ3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbm9uZS5jb2RlCkBAIC0wLDAgKzEgQEAKK05vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1ub25lLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbm9uZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDdlYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tbm9uZS5kYXRhCkBAIC0wLDAgKzEgQEAKKyEhcHl0aG9uL25vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1vYmplY3QuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1vYmplY3QuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFlZGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLW9iamVjdC5jb2RlCkBAIC0wLDAgKzEsMjMgQEAKK1sKK0FuT2JqZWN0KDEsICd0d28nLCBbMywzLDNdKSwKK0FuSW5zdGFuY2UoMSwgJ3R3bycsIFszLDMsM10pLAorCitBbk9iamVjdCgxLCAndHdvJywgWzMsMywzXSksCitBbkluc3RhbmNlKDEsICd0d28nLCBbMywzLDNdKSwKKworQVN0YXRlKDEsICd0d28nLCBbMywzLDNdKSwKK0FDdXN0b21TdGF0ZSgxLCAndHdvJywgWzMsMywzXSksCisKK0luaXRBcmdzKDEsICd0d28nLCBbMywzLDNdKSwKK0luaXRBcmdzV2l0aFN0YXRlKDEsICd0d28nLCBbMywzLDNdKSwKKworTmV3QXJncygxLCAndHdvJywgWzMsMywzXSksCitOZXdBcmdzV2l0aFN0YXRlKDEsICd0d28nLCBbMywzLDNdKSwKKworUmVkdWNlKDEsICd0d28nLCBbMywzLDNdKSwKK1JlZHVjZVdpdGhTdGF0ZSgxLCAndHdvJywgWzMsMywzXSksCisKK015SW50KDMpLAorTXlMaXN0KDMpLAorTXlEaWN0KDMpLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLW9iamVjdC5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLW9iamVjdC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZThiMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tb2JqZWN0LmRhdGEKQEAgLTAsMCArMSwyMSBAQAorLSAhIXB5dGhvbi9vYmplY3Q6dGVzdF9jb25zdHJ1Y3Rvci5Bbk9iamVjdCB7IGZvbzogMSwgYmFyOiB0d28sIGJhejogWzMsMywzXSB9CistICEhcHl0aG9uL29iamVjdDp0ZXN0X2NvbnN0cnVjdG9yLkFuSW5zdGFuY2UgeyBmb286IDEsIGJhcjogdHdvLCBiYXo6IFszLDMsM10gfQorCistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5Bbk9iamVjdCB7IGFyZ3M6IFsxLCB0d29dLCBrd2RzOiB7YmF6OiBbMywzLDNdfSB9CistICEhcHl0aG9uL29iamVjdC9hcHBseTp0ZXN0X2NvbnN0cnVjdG9yLkFuSW5zdGFuY2UgeyBhcmdzOiBbMSwgdHdvXSwga3dkczoge2JhejogWzMsMywzXX0gfQorCistICEhcHl0aG9uL29iamVjdDp0ZXN0X2NvbnN0cnVjdG9yLkFTdGF0ZSB7IF9mb286IDEsIF9iYXI6IHR3bywgX2JhejogWzMsMywzXSB9CistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5BQ3VzdG9tU3RhdGUgeyBzdGF0ZTogISFweXRob24vdHVwbGUgWzEsIHR3bywgWzMsMywzXV0gfQorCistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5Jbml0QXJncyBbMSwgdHdvLCBbMywzLDNdXQorLSAhIXB5dGhvbi9vYmplY3QvbmV3OnRlc3RfY29uc3RydWN0b3IuSW5pdEFyZ3NXaXRoU3RhdGUgeyBhcmdzOiBbMSwgdHdvXSwgc3RhdGU6IFszLDMsM10gfQorCistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5OZXdBcmdzIFsxLCB0d28sIFszLDMsM11dCistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5OZXdBcmdzV2l0aFN0YXRlIHsgYXJnczogWzEsIHR3b10sIHN0YXRlOiBbMywzLDNdIH0KKworLSAhIXB5dGhvbi9vYmplY3QvYXBwbHk6dGVzdF9jb25zdHJ1Y3Rvci5SZWR1Y2UgWzEsIHR3bywgWzMsMywzXV0KKy0gISFweXRob24vb2JqZWN0L2FwcGx5OnRlc3RfY29uc3RydWN0b3IuUmVkdWNlV2l0aFN0YXRlIHsgYXJnczogWzEsIHR3b10sIHN0YXRlOiBbMywzLDNdIH0KKworLSAhIXB5dGhvbi9vYmplY3QvbmV3OnRlc3RfY29uc3RydWN0b3IuTXlJbnQgWzNdCistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5NeUxpc3QgeyBsaXN0aXRlbXM6IFt+LCB+LCB+XSB9CistICEhcHl0aG9uL29iamVjdC9uZXc6dGVzdF9jb25zdHJ1Y3Rvci5NeURpY3QgeyBkaWN0aXRlbXM6IHswLCAxLCAyfSB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLWFzY2lpLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLWFzY2lpLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkNjJmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItYXNjaWkuY29kZQpAQCAtMCwwICsxIEBACisiYXNjaWkgc3RyaW5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci1hc2NpaS5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci1hc2NpaS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzM0OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLWFzY2lpLmRhdGEKQEAgLTAsMCArMSBAQAorLS0tICEhcHl0aG9uL3N0ciAiYXNjaWkgc3RyaW5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci11dGY4LXB5Mi5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci11dGY4LXB5Mi5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjI4YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLXV0ZjgtcHkyLmNvZGUKQEAgLTAsMCArMSBAQAordSdcdTA0MmRcdTA0NDJcdTA0M2UgXHUwNDQzXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCcuZW5jb2RlKCd1dGYtOCcpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLXV0ZjgtcHkyLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tc3RyLXV0ZjgtcHkyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmMmM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItdXRmOC1weTIuZGF0YQpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vc3RyICLQrdGC0L4g0YPQvdC40LrQvtC00L3QsNGPINGB0YLRgNC+0LrQsCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItdXRmOC1weTMuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItdXRmOC1weTMuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY2MDMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci11dGY4LXB5My5jb2RlCkBAIC0wLDAgKzEgQEAKKydcdTA0MmRcdTA0NDJcdTA0M2UgXHUwNDQzXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItdXRmOC1weTMuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi1zdHItdXRmOC1weTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWYyYzcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXN0ci11dGY4LXB5My5kYXRhCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9zdHIgItCt0YLQviDRg9C90LjQutC+0LTQvdCw0Y8g0YHRgtGA0L7QutCwIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXR1cGxlLWxpc3QtZGljdC5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXR1cGxlLWxpc3QtZGljdC5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwY2VkOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdHVwbGUtbGlzdC1kaWN0LmNvZGUKQEAgLTAsMCArMSw2IEBACitbCisgICAgWzEsIDIsIDMsIDRdLAorICAgICgxLCAyLCAzLCA0KSwKKyAgICB7MTogMiwgMzogNH0sCisgICAgeygwLDApOiAwLCAoMCwxKTogMSwgKDEsMCk6IDEsICgxLDEpOiAwfSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi10dXBsZS1saXN0LWRpY3QuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi10dXBsZS1saXN0LWRpY3QuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYxNTliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXR1cGxlLWxpc3QtZGljdC5kYXRhCkBAIC0wLDAgKzEsOCBAQAorLSAhIXB5dGhvbi9saXN0IFsxLCAyLCAzLCA0XQorLSAhIXB5dGhvbi90dXBsZSBbMSwgMiwgMywgNF0KKy0gISFweXRob24vZGljdCB7MTogMiwgMzogNH0KKy0gISFweXRob24vZGljdAorICAgICEhcHl0aG9uL3R1cGxlIFswLDBdOiAwCisgICAgISFweXRob24vdHVwbGUgWzAsMV06IDEKKyAgICAhIXB5dGhvbi90dXBsZSBbMSwwXTogMQorICAgICEhcHl0aG9uL3R1cGxlIFsxLDFdOiAwCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS1hc2NpaS1weTIuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi11bmljb2RlLWFzY2lpLXB5Mi5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2Q4MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS1hc2NpaS1weTIuY29kZQpAQCAtMCwwICsxIEBACit1ImFzY2lpIHN0cmluZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi11bmljb2RlLWFzY2lpLXB5Mi5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtYXNjaWktcHkyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwNjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi11bmljb2RlLWFzY2lpLXB5Mi5kYXRhCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi91bmljb2RlICJhc2NpaSBzdHJpbmciCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS1hc2NpaS1weTMuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi11bmljb2RlLWFzY2lpLXB5My5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDYyZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS1hc2NpaS1weTMuY29kZQpAQCAtMCwwICsxIEBACisiYXNjaWkgc3RyaW5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtYXNjaWktcHkzLmRhdGEgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS1hc2NpaS1weTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA2NDdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtYXNjaWktcHkzLmRhdGEKQEAgLTAsMCArMSBAQAorLS0tICEhcHl0aG9uL3VuaWNvZGUgImFzY2lpIHN0cmluZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXB5dGhvbi11bmljb2RlLXV0ZjgtcHkyLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS11dGY4LXB5Mi5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTNhYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS11dGY4LXB5Mi5jb2RlCkBAIC0wLDAgKzEgQEAKK3UnXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQ0M1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2FcdTA0MzAnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS11dGY4LXB5Mi5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTk4MGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTIuZGF0YQpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vdW5pY29kZSAi0K3RgtC+INGD0L3QuNC60L7QtNC90LDRjyDRgdGC0YDQvtC60LAiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS11dGY4LXB5My5jb2RlIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTMuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY2MDMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTMuY29kZQpAQCAtMCwwICsxIEBACisnXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQ0M1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2FcdTA0MzAnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1weXRob24tdW5pY29kZS11dGY4LXB5My5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTk4MGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtcHl0aG9uLXVuaWNvZGUtdXRmOC1weTMuZGF0YQpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vdW5pY29kZSAi0K3RgtC+INGD0L3QuNC60L7QtNC90LDRjyDRgdGC0YDQvtC60LAiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXEuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXNlcS5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTBjMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXEuY29kZQpAQCAtMCwwICsxLDQgQEAKK3sKKyAgICAiQmxvY2sgc3R5bGUiOiBbIk1lcmN1cnkiLCAiVmVudXMiLCAiRWFydGgiLCAiTWFycyIsICJKdXBpdGVyIiwgIlNhdHVybiIsICJVcmFudXMiLCAiTmVwdHVuZSIsICJQbHV0byJdLAorICAgICJGbG93IHN0eWxlIjogWyJNZXJjdXJ5IiwgIlZlbnVzIiwgIkVhcnRoIiwgIk1hcnMiLCAiSnVwaXRlciIsICJTYXR1cm4iLCAiVXJhbnVzIiwgIk5lcHR1bmUiLCAiUGx1dG8iXSwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXNlcS5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc2VxLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5MmZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXNlcS5kYXRhCkBAIC0wLDAgKzEsMTUgQEAKKyMgT3JkZXJlZCBzZXF1ZW5jZSBvZiBub2RlcworQmxvY2sgc3R5bGU6ICEhc2VxCistIE1lcmN1cnkgICAjIFJvdGF0ZXMgLSBubyBsaWdodC9kYXJrIHNpZGVzLgorLSBWZW51cyAgICAgIyBEZWFkbGllc3QuIEFwdGx5IG5hbWVkLgorLSBFYXJ0aCAgICAgIyBNb3N0bHkgZGlydC4KKy0gTWFycyAgICAgICMgU2VlbXMgZW1wdHkuCistIEp1cGl0ZXIgICAjIFRoZSBraW5nLgorLSBTYXR1cm4gICAgIyBQcmV0dHkuCistIFVyYW51cyAgICAjIFdoZXJlIHRoZSBzdW4gaGFyZGx5IHNoaW5lcy4KKy0gTmVwdHVuZSAgICMgQm9yaW5nLiBObyByaW5ncy4KKy0gUGx1dG8gICAgICMgWW91IGNhbGwgdGhpcyBhIHBsYW5ldD8KK0Zsb3cgc3R5bGU6ICEhc2VxIFsgTWVyY3VyeSwgVmVudXMsIEVhcnRoLCBNYXJzLCAgICAgICMgUm9ja3MKKyAgICAgICAgICAgICAgICAgICAgSnVwaXRlciwgU2F0dXJuLCBVcmFudXMsIE5lcHR1bmUsICMgR2FzCisgICAgICAgICAgICAgICAgICAgIFBsdXRvIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIE92ZXJyYXRlZAorCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXQuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXNldC5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDkwZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXQuY29kZQpAQCAtMCwwICsxLDQgQEAKK3sKKyAgICAiYmFzZWJhbGwgcGxheWVycyI6IHNldChbIk1hcmsgTWNHd2lyZSIsICJTYW1teSBTb3NhIiwgIktlbiBHcmlmZmV5Il0pLAorICAgICJiYXNlYmFsbCB0ZWFtcyI6IHNldChbIkJvc3RvbiBSZWQgU294IiwgIkRldHJvaXQgVGlnZXJzIiwgIk5ldyBZb3JrIFlhbmtlZXMiXSksCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXQuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXNldC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWRjODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zZXQuZGF0YQpAQCAtMCwwICsxLDcgQEAKKyMgRXhwbGljaXRseSB0eXBlZCBzZXQuCitiYXNlYmFsbCBwbGF5ZXJzOiAhIXNldAorICA/IE1hcmsgTWNHd2lyZQorICA/IFNhbW15IFNvc2EKKyAgPyBLZW4gR3JpZmZleQorIyBGbG93IHN0eWxlCitiYXNlYmFsbCB0ZWFtczogISFzZXQgeyBCb3N0b24gUmVkIFNveCwgRGV0cm9pdCBUaWdlcnMsIE5ldyBZb3JrIFlhbmtlZXMgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLWFzY2lpLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItYXNjaWkuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWQ2MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLWFzY2lpLmNvZGUKQEAgLTAsMCArMSBAQAorImFzY2lpIHN0cmluZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci1hc2NpaS5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLWFzY2lpLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5MzAxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci1hc2NpaS5kYXRhCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXN0ciAiYXNjaWkgc3RyaW5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLXV0ZjgtcHkyLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItdXRmOC1weTIuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzkzYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLXV0ZjgtcHkyLmNvZGUKQEAgLTAsMCArMSBAQAordSdcdTA0MmRcdTA0NDJcdTA0M2UgXHUwNDQzXHUwNDNkXHUwNDM4XHUwNDNhXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDMwXHUwNDRmIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzYVx1MDQzMCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci11dGY4LXB5Mi5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLXV0ZjgtcHkyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NWYxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci11dGY4LXB5Mi5kYXRhCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXN0ciAi0K3RgtC+INGD0L3QuNC60L7QtNC90LDRjyDRgdGC0YDQvtC60LAiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItdXRmOC1weTMuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci11dGY4LXB5My5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjYwMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItdXRmOC1weTMuY29kZQpAQCAtMCwwICsxIEBACisnXHUwNDJkXHUwNDQyXHUwNDNlIFx1MDQ0M1x1MDQzZFx1MDQzOFx1MDQzYVx1MDQzZVx1MDQzNFx1MDQzZFx1MDQzMFx1MDQ0ZiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2FcdTA0MzAnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItdXRmOC1weTMuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci11dGY4LXB5My5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTVmMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHItdXRmOC1weTMuZGF0YQpAQCAtMCwwICsxIEBACistLS0gISFzdHIgItCt0YLQviDRg9C90LjQutC+0LTQvdCw0Y8g0YHRgtGA0L7QutCwIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC1zdHIuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU3MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLmNvZGUKQEAgLTAsMCArMSBAQAoreyAic3RyaW5nIjogImFiY2QiIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci5kYXRhIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3Qtc3RyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2YWM2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXN0ci5kYXRhCkBAIC0wLDAgKzEgQEAKK3N0cmluZzogYWJjZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtdGltZXN0YW1wLmNvZGUgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC10aW1lc3RhbXAuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMzYjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtdGltZXN0YW1wLmNvZGUKQEAgLTAsMCArMSw3IEBACit7CisgICAgImNhbm9uaWNhbCI6IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDEsIDEyLCAxNSwgMiwgNTksIDQzLCAxMDAwMDApLAorICAgICJ2YWxpZCBpc284NjAxIjogZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDE1LCAyLCA1OSwgNDMsIDEwMDAwMCksCisgICAgInNwYWNlIHNlcGFyYXRlZCI6IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDEsIDEyLCAxNSwgMiwgNTksIDQzLCAxMDAwMDApLAorICAgICJubyB0aW1lIHpvbmUgKFopIjogZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDE1LCAyLCA1OSwgNDMsIDEwMDAwMCksCisgICAgImRhdGUgKDAwOjAwOjAwWikiOiBkYXRldGltZS5kYXRlKDIwMDIsIDEyLCAxNCksCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NvbnN0cnVjdC10aW1lc3RhbXAuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXRpbWVzdGFtcC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjM4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2NvbnN0cnVjdC10aW1lc3RhbXAuZGF0YQpAQCAtMCwwICsxLDUgQEAKK2Nhbm9uaWNhbDogICAgICAgIDIwMDEtMTItMTVUMDI6NTk6NDMuMVoKK3ZhbGlkIGlzbzg2MDE6ICAgIDIwMDEtMTItMTR0MjE6NTk6NDMuMTAtMDU6MDAKK3NwYWNlIHNlcGFyYXRlZDogIDIwMDEtMTItMTQgMjE6NTk6NDMuMTAgLTUKK25vIHRpbWUgem9uZSAoWik6IDIwMDEtMTItMTUgMjo1OTo0My4xMAorZGF0ZSAoMDA6MDA6MDBaKTogMjAwMi0xMi0xNApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtdmFsdWUuY29kZSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXZhbHVlLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMDE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXZhbHVlLmNvZGUKQEAgLTAsMCArMSw5IEBACitbCisgICAgeyAibGluayB3aXRoIjogWyAibGlicmFyeTEuZGxsIiwgImxpYnJhcnkyLmRsbCIgXSB9LAorICAgIHsKKyAgICAgICAgImxpbmsgd2l0aCI6IFsKKyAgICAgICAgICAgIHsgIj0iOiAibGlicmFyeTEuZGxsIiwgInZlcnNpb24iOiAxLjIgfSwKKyAgICAgICAgICAgIHsgIj0iOiAibGlicmFyeTIuZGxsIiwgInZlcnNpb24iOiAyLjMgfSwKKyAgICAgICAgXSwKKyAgICB9LAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9jb25zdHJ1Y3QtdmFsdWUuZGF0YSBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXZhbHVlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViNzkxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY29uc3RydWN0LXZhbHVlLmRhdGEKQEAgLTAsMCArMSwxMCBAQAorLS0tICAgICAjIE9sZCBzY2hlbWEKK2xpbmsgd2l0aDoKKyAgLSBsaWJyYXJ5MS5kbGwKKyAgLSBsaWJyYXJ5Mi5kbGwKKy0tLSAgICAgIyBOZXcgc2NoZW1hCitsaW5rIHdpdGg6CisgIC0gPSA6IGxpYnJhcnkxLmRsbAorICAgIHZlcnNpb246IDEuMgorICAtID0gOiBsaWJyYXJ5Mi5kbGwKKyAgICB2ZXJzaW9uOiAyLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZG9jdW1lbnQtc2VwYXJhdG9yLWluLXF1b3RlZC1zY2FsYXIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9kb2N1bWVudC1zZXBhcmF0b3ItaW4tcXVvdGVkLXNjYWxhci5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlYjBkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZG9jdW1lbnQtc2VwYXJhdG9yLWluLXF1b3RlZC1zY2FsYXIubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMTEgQEAKKy0tLQorInRoaXMgLS0tIGlzIGNvcnJlY3QiCistLS0KKyJ0aGlzCisuLi5pcyBhbHNvCitjb3JyZWN0IgorLS0tCisiYSBxdW90ZWQgc2NhbGFyCitjYW5ub3QgY29udGFpbgorLS0tCitkb2N1bWVudCBzZXBhcmF0b3JzIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kb2N1bWVudHMuZXZlbnRzIGIvdGVzdHMvZGF0YS9kb2N1bWVudHMuZXZlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NWE1MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2RvY3VtZW50cy5ldmVudHMKQEAgLTAsMCArMSwxMSBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIURvY3VtZW50U3RhcnQgeyBleHBsaWNpdDogZmFsc2UgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLGZhbHNlXSwgdmFsdWU6ICdkYXRhJyB9CistICFEb2N1bWVudEVuZAorLSAhRG9jdW1lbnRTdGFydAorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLGZhbHNlXSB9CistICFEb2N1bWVudEVuZAorLSAhRG9jdW1lbnRTdGFydCB7IHZlcnNpb246IFsxLDFdLCB0YWdzOiB7ICchJzogJyFmb28nLCAnIXlhbWwhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicsICchdWdseSEnOiAnISEhISEhIScgfSB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsZmFsc2VdIH0KKy0gIURvY3VtZW50RW5kCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWFuY2hvci0xLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWFuY2hvci0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZjZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtYW5jaG9yLTEubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorLSAmZm9vIGJhcgorLSAmYmFyIGJhcgorLSAmZm9vIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUtYW5jaG9yLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtYW5jaG9yLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjQzODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1hbmNob3ItMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorJmZvbyBbMSwgMiwgMywgJmZvbyA0XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuY29kZSBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3MzkwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmNvZGUKQEAgLTAsMCArMSBAQAoreyAnZm9vJzogJ2JheicgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuZGF0YSBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkZWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEKQEAgLTAsMCArMSwzIEBACistLS0KK2ZvbzogYmFyCitmb286IGJhegpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUtbWFwcGluZy1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5jb2RlIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtbWFwcGluZy1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YTYyODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tYXBwaW5nLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmNvZGUKQEAgLTAsMCArMSBAQAoreyAnZm9vJzogeyAnYmF6JzogJ2JhdCcsICdmb28nOiAnZHVwbGljYXRlIGtleScgfSB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tYXBwaW5nLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tYXBwaW5nLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YjRkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZHVwbGljYXRlLW1hcHBpbmcta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuZGF0YQpAQCAtMCwwICsxLDYgQEAKKy0tLQorJmFuY2hvciBmb286CisgICAgZm9vOiBiYXIKKyAgICAqYW5jaG9yOiBkdXBsaWNhdGUga2V5CisgICAgYmF6OiBiYXQKKyAgICAqYW5jaG9yOiBkdXBsaWNhdGUga2V5CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tZXJnZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5jb2RlIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtbWVyZ2Uta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc1N2YzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtbWVyZ2Uta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuY29kZQpAQCAtMCwwICsxIEBACit7ICd4JzogMSwgJ3knOiAyLCAnZm9vJzogJ2JhcicsICd6JzogMywgJ3QnOiA0IH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZHVwbGljYXRlLW1lcmdlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tZXJnZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmMzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS1tZXJnZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5kYXRhCkBAIC0wLDAgKzEsNCBAQAorLS0tCis8PDoge3g6IDEsIHk6IDJ9Citmb286IGJhcgorPDw6IHt6OiAzLCB0OiA0fQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUtdGFnLWRpcmVjdGl2ZS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS10YWctZGlyZWN0aXZlLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM4MWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtdGFnLWRpcmVjdGl2ZS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACislVEFHICAgICFmb28hICAgYmFyCislVEFHICAgICFmb28hICAgYmF6CistLS0gZm9vCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2R1cGxpY2F0ZS12YWx1ZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5jb2RlIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtdmFsdWUta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmY0OGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUtdmFsdWUta2V5LmZvcm1lci1sb2FkZXItZXJyb3IuY29kZQpAQCAtMCwwICsxIEBACit7ICdmb28nOiAnYmFyJywgJz0nOiAyIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZHVwbGljYXRlLXZhbHVlLWtleS5mb3JtZXItbG9hZGVyLWVycm9yLmRhdGEgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS12YWx1ZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNGExZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS12YWx1ZS1rZXkuZm9ybWVyLWxvYWRlci1lcnJvci5kYXRhCkBAIC0wLDAgKzEsNCBAQAorLS0tCis9OiAxCitmb286IGJhcgorPTogMgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9kdXBsaWNhdGUteWFtbC1kaXJlY3RpdmUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9kdXBsaWNhdGUteWFtbC1kaXJlY3RpdmUubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzIzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2R1cGxpY2F0ZS15YW1sLWRpcmVjdGl2ZS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACislWUFNTCAgIDEuMQorJVlBTUwgICAxLjEKKy0tLSBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1pdC1ibG9jay1zY2FsYXItaW4tc2ltcGxlLWtleS1jb250ZXh0LWJ1Zy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL2VtaXQtYmxvY2stc2NhbGFyLWluLXNpbXBsZS1rZXktY29udGV4dC1idWcuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2JlZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2VtaXQtYmxvY2stc2NhbGFyLWluLXNpbXBsZS1rZXktY29udGV4dC1idWcuY2Fub25pY2FsCkBAIC0wLDAgKzEsNiBAQAorJVlBTUwgMS4xCistLS0gISFtYXAKK3sKKyAgPyAhIXN0ciAiZm9vIgorICA6ICEhc3RyICJiYXIiCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2VtaXQtYmxvY2stc2NhbGFyLWluLXNpbXBsZS1rZXktY29udGV4dC1idWcuZGF0YSBiL3Rlc3RzL2RhdGEvZW1pdC1ibG9jay1zY2FsYXItaW4tc2ltcGxlLWtleS1jb250ZXh0LWJ1Zy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjQyYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2VtaXQtYmxvY2stc2NhbGFyLWluLXNpbXBsZS1rZXktY29udGV4dC1idWcuZGF0YQpAQCAtMCwwICsxLDQgQEAKKz8gfC0KKyAgZm9vCis6IHwtCisgIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbWl0dGluZy11bmFjY2VwdGFibGUtdW5pY29kZS1jaGFyYWN0ZXItYnVnLXB5Mi5jb2RlIGIvdGVzdHMvZGF0YS9lbWl0dGluZy11bmFjY2VwdGFibGUtdW5pY29kZS1jaGFyYWN0ZXItYnVnLXB5Mi5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTI4NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2VtaXR0aW5nLXVuYWNjZXB0YWJsZS11bmljb2RlLWNoYXJhY3Rlci1idWctcHkyLmNvZGUKQEAgLTAsMCArMSBAQAordSJcdWRkMDAiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2VtaXR0aW5nLXVuYWNjZXB0YWJsZS11bmljb2RlLWNoYXJhY3Rlci1idWctcHkyLmRhdGEgYi90ZXN0cy9kYXRhL2VtaXR0aW5nLXVuYWNjZXB0YWJsZS11bmljb2RlLWNoYXJhY3Rlci1idWctcHkyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTIuZGF0YQpAQCAtMCwwICsxIEBACisiXHVkZDAwIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbWl0dGluZy11bmFjY2VwdGFibGUtdW5pY29kZS1jaGFyYWN0ZXItYnVnLXB5Mi5za2lwLWV4dCBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTIuc2tpcC1leHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTIuc2tpcC1leHQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTMuY29kZSBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTMuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVkZjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9lbWl0dGluZy11bmFjY2VwdGFibGUtdW5pY29kZS1jaGFyYWN0ZXItYnVnLXB5My5jb2RlCkBAIC0wLDAgKzEgQEAKKyJcdWRkMDAiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2VtaXR0aW5nLXVuYWNjZXB0YWJsZS11bmljb2RlLWNoYXJhY3Rlci1idWctcHkzLmRhdGEgYi90ZXN0cy9kYXRhL2VtaXR0aW5nLXVuYWNjZXB0YWJsZS11bmljb2RlLWNoYXJhY3Rlci1idWctcHkzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTMuZGF0YQpAQCAtMCwwICsxIEBACisiXHVkZDAwIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbWl0dGluZy11bmFjY2VwdGFibGUtdW5pY29kZS1jaGFyYWN0ZXItYnVnLXB5My5za2lwLWV4dCBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTMuc2tpcC1leHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1pdHRpbmctdW5hY2NlcHRhYmxlLXVuaWNvZGUtY2hhcmFjdGVyLWJ1Zy1weTMuc2tpcC1leHQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1wdHktYW5jaG9yLmVtaXR0ZXItZXJyb3IgYi90ZXN0cy9kYXRhL2VtcHR5LWFuY2hvci5lbWl0dGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2VtcHR5LWFuY2hvci5lbWl0dGVyLWVycm9yCkBAIC0wLDAgKzEsNSBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIURvY3VtZW50U3RhcnQKKy0gIVNjYWxhciB7IGFuY2hvcjogJycsIHZhbHVlOiAnZm9vJyB9CistICFEb2N1bWVudEVuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50LWJ1Zy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50LWJ1Zy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhNmNmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1wdHktZG9jdW1lbnQtYnVnLmNhbm9uaWNhbApAQCAtMCwwICsxIEBACisjIFRoaXMgWUFNTCBzdHJlYW0gY29udGFpbnMgbm8gWUFNTCBkb2N1bWVudHMuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50LWJ1Zy5kYXRhIGIvdGVzdHMvZGF0YS9lbXB0eS1kb2N1bWVudC1idWcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9lbXB0eS1kb2N1bWVudC1idWcuZGF0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbXB0eS1kb2N1bWVudC1idWcuZW1wdHkgYi90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50LWJ1Zy5lbXB0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9lbXB0eS1kb2N1bWVudC1idWcuZW1wdHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1wdHktZG9jdW1lbnRzLnNpbmdsZS1sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50cy5zaW5nbGUtbG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGJhOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2VtcHR5LWRvY3VtZW50cy5zaW5nbGUtbG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorLS0tICMgZmlyc3QgZG9jdW1lbnQKKy0tLSAjIHNlY29uZCBkb2N1bWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbXB0eS1weXRob24tbW9kdWxlLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZW1wdHktcHl0aG9uLW1vZHVsZS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkMzIzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1wdHktcHl0aG9uLW1vZHVsZS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICEhcHl0aG9uOm1vZHVsZToKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1wdHktcHl0aG9uLW5hbWUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9lbXB0eS1weXRob24tbmFtZS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2Mjk1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1wdHktcHl0aG9uLW5hbWUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9uYW1lOiBlbXB0eQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbXB0eS10YWctaGFuZGxlLmVtaXR0ZXItZXJyb3IgYi90ZXN0cy9kYXRhL2VtcHR5LXRhZy1oYW5kbGUuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVjODk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9lbXB0eS10YWctaGFuZGxlLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw1IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydCB7IHRhZ3M6IHsgJyc6ICdiYXInIH0gfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdmb28nIH0KKy0gIURvY3VtZW50RW5kCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZW1wdHktdGFnLXByZWZpeC5lbWl0dGVyLWVycm9yIGIvdGVzdHMvZGF0YS9lbXB0eS10YWctcHJlZml4LmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMGU5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1wdHktdGFnLXByZWZpeC5lbWl0dGVyLWVycm9yCkBAIC0wLDAgKzEsNSBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIURvY3VtZW50U3RhcnQgeyB0YWdzOiB7ICchJzogJycgfSB9CistICFTY2FsYXIgeyB2YWx1ZTogJ2ZvbycgfQorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9lbXB0eS10YWcuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZW1wdHktdGFnLmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjYTU5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZW1wdHktdGFnLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw1IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydAorLSAhU2NhbGFyIHsgdGFnOiAnJywgdmFsdWU6ICdrZXknLCBpbXBsaWNpdDogW2ZhbHNlLGZhbHNlXSB9CistICFEb2N1bWVudEVuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2V4cGVjdGVkLWRvY3VtZW50LWVuZC5lbWl0dGVyLWVycm9yIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1kb2N1bWVudC1lbmQuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JhYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1kb2N1bWVudC1lbmQuZW1pdHRlci1lcnJvcgpAQCAtMCwwICsxLDYgQEAKKy0gIVN0cmVhbVN0YXJ0CistICFEb2N1bWVudFN0YXJ0CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEgMScgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhIDInIH0KKy0gIURvY3VtZW50RW5kCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtZG9jdW1lbnQtc3RhcnQuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtZG9jdW1lbnQtc3RhcnQuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U1NzVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1kb2N1bWVudC1zdGFydC5lbWl0dGVyLWVycm9yCkBAIC0wLDAgKzEsNCBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIU1hcHBpbmdTdGFydAorLSAhTWFwcGluZ0VuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2V4cGVjdGVkLW1hcHBpbmcubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1tYXBwaW5nLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFlZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1tYXBwaW5nLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gISFtYXAgW25vdCwgYSwgbWFwXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9leHBlY3RlZC1ub2RlLTEuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtbm9kZS0xLmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZWNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtbm9kZS0xLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw0IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydAorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9leHBlY3RlZC1ub2RlLTIuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtbm9kZS0yLmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxZWUzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtbm9kZS0yLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw3IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydAorLSAhTWFwcGluZ1N0YXJ0CistICFTY2FsYXIgeyB2YWx1ZTogJ2tleScgfQorLSAhTWFwcGluZ0VuZAorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9leHBlY3RlZC1ub3RoaW5nLmVtaXR0ZXItZXJyb3IgYi90ZXN0cy9kYXRhL2V4cGVjdGVkLW5vdGhpbmcuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM1NGQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1ub3RoaW5nLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw0IEBACistICFTdHJlYW1TdGFydAorLSAhU3RyZWFtRW5kCistICFTdHJlYW1TdGFydAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2V4cGVjdGVkLXNjYWxhci5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2V4cGVjdGVkLXNjYWxhci5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzMTcxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtc2NhbGFyLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gISFzdHIgW25vdCBhIHNjYWxhcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtc2VxdWVuY2UubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9leHBlY3RlZC1zZXF1ZW5jZS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNzRlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtc2VxdWVuY2UubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXNlcSB7Zm9vLCBiYXIsIGJhen0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZXhwZWN0ZWQtc3RyZWFtLXN0YXJ0LmVtaXR0ZXItZXJyb3IgYi90ZXN0cy9kYXRhL2V4cGVjdGVkLXN0cmVhbS1zdGFydC5lbWl0dGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGRjMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2V4cGVjdGVkLXN0cmVhbS1zdGFydC5lbWl0dGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorLSAhRG9jdW1lbnRTdGFydAorLSAhRG9jdW1lbnRFbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZXhwbGljaXQtZG9jdW1lbnQuc2luZ2xlLWxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZXhwbGljaXQtZG9jdW1lbnQuc2luZ2xlLWxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM2ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9leHBsaWNpdC1kb2N1bWVudC5zaW5nbGUtbG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsNCBAQAorLS0tCitmb286IGJhcgorLS0tCitmb286IGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9mZXRjaC1jb21wbGV4LXZhbHVlLWJ1Zy5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ZldGNoLWNvbXBsZXgtdmFsdWUtYnVnLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZhYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mZXRjaC1jb21wbGV4LXZhbHVlLWJ1Zy5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwyIEBACis/ICJmb28iCisgOiAiYmFyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9mbG9hdC1yZXByZXNlbnRlci0yLjMtYnVnLmNvZGUgYi90ZXN0cy9kYXRhL2Zsb2F0LXJlcHJlc2VudGVyLTIuMy1idWcuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRiODM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mbG9hdC1yZXByZXNlbnRlci0yLjMtYnVnLmNvZGUKQEAgLTAsMCArMSw3IEBACit7CisjICAgIDAuMDogMCwKKyAgICAxLjA6IDEsCisgICAgMWUzMDAwMDA6ICsxMCwKKyAgICAtMWUzMDAwMDA6IC0xMCwKKyAgICAxZTMwMDAwMC8xZTMwMDAwMDogMTAwLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9mbG9hdC1yZXByZXNlbnRlci0yLjMtYnVnLmRhdGEgYi90ZXN0cy9kYXRhL2Zsb2F0LXJlcHJlc2VudGVyLTIuMy1idWcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQxNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mbG9hdC1yZXByZXNlbnRlci0yLjMtYnVnLmRhdGEKQEAgLTAsMCArMSw1IEBACisjMC4wOiAgICMgaGFzaCgwKSA9PSBoYXNoKG5hbikgYW5kIDAgPT0gbmFuIGluIFB5dGhvbiAyLjMKKzEuMDogMQorKy5pbmY6IDEwCistLmluZjogLTEwCisubmFuOiAxMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZmxvYXQuZGF0YSBiL3Rlc3RzL2RhdGEvZmxvYXQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRkNWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mbG9hdC5kYXRhCkBAIC0wLDAgKzEsNiBAQAorLSA2Ljg1MjMwMTVlKzUKKy0gNjg1LjIzMF8xNWUrMDMKKy0gNjg1XzIzMC4xNQorLSAxOTA6MjA6MzAuMTUKKy0gLS5pbmYKKy0gLk5hTgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9mbG9hdC5kZXRlY3QgYi90ZXN0cy9kYXRhL2Zsb2F0LmRldGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTEyMzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mbG9hdC5kZXRlY3QKQEAgLTAsMCArMSBAQAordGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvZm9yYmlkZGVuLWVudHJ5LmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvZm9yYmlkZGVuLWVudHJ5LmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUzMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mb3JiaWRkZW4tZW50cnkubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAordGVzdDogLSBmb28KKyAgICAgIC0gYmFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ZvcmJpZGRlbi1rZXkubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9mb3JiaWRkZW4ta2V5LmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTliNDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9mb3JiaWRkZW4ta2V5LmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKK3Rlc3Q6ID8gZm9vCisgICAgICA6IGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9mb3JiaWRkZW4tdmFsdWUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9mb3JiaWRkZW4tdmFsdWUubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDdjZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ZvcmJpZGRlbi12YWx1ZS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAordGVzdDoga2V5OiB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbXBsaWNpdC1kb2N1bWVudC5zaW5nbGUtbG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbXBsaWNpdC1kb2N1bWVudC5zaW5nbGUtbG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzlhNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ltcGxpY2l0LWRvY3VtZW50LnNpbmdsZS1sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACitmb286IGJhcgorLS0tCitmb286IGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnQuZGF0YSBiL3Rlc3RzL2RhdGEvaW50LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0ZDM3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW50LmRhdGEKQEAgLTAsMCArMSw2IEBACistIDY4NTIzMAorLSArNjg1XzIzMAorLSAwMjQ3MjI1NgorLSAweF8wQV83NF9BRQorLSAwYjEwMTBfMDExMV8wMTAwXzEwMTBfMTExMAorLSAxOTA6MjA6MzAKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW50LmRldGVjdCBiL3Rlc3RzL2RhdGEvaW50LmRldGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVjOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnQuZGV0ZWN0CkBAIC0wLDAgKzEgQEAKK3RhZzp5YW1sLm9yZywyMDAyOmludApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLWFuY2hvci0xLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1hbmNob3ItMS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmN2QwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1hbmNob3ItMS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICY/ICBmb28gIyB3ZSBhbGxvdyBvbmx5IGFzY2lpIGFuZCBudW1lcmljIGNoYXJhY3RlcnMgaW4gYW5jaG9yIG5hbWVzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLWFuY2hvci0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1hbmNob3ItMi5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjNGZmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1hbmNob3ItMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSw4IEBACistLS0KKy0gWworICAgICZjb3JyZWN0IGZvbywKKyAgICAqY29ycmVjdCwKKyAgICAqY29ycmVjdF0gICAjIHN0aWxsIGNvcnJlY3QKKy0gKmNvcnJlY3Q6IHN0aWxsIGNvcnJlY3QKKy0gJmNvcnJlY3Qtb3Itbm90W2ZvbywgYmFyXQorCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtYW5jaG9yLmVtaXR0ZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtYW5jaG9yLmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyYTgxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1hbmNob3IuZW1pdHRlci1lcnJvcgpAQCAtMCwwICsxLDUgQEAKKy0gIVN0cmVhbVN0YXJ0CistICFEb2N1bWVudFN0YXJ0CistICFTY2FsYXIgeyBhbmNob3I6ICc1KjU9MjUnLCB2YWx1ZTogJ2ZvbycgfQorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLWJhc2U2NC1kYXRhLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWJhc2U2NC1kYXRhLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTNhNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtYmFzZTY0LWRhdGEtMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwyIEBACistLS0gISFiaW5hcnkKKyAgICDQtNCy0L7QuNGH0L3Ri9C1INC00LDQvdC90YvQtSDQsiBiYXNlNjQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1iYXNlNjQtZGF0YS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtYmFzZTY0LWRhdGEubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGFiYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtYmFzZTY0LWRhdGEubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorLS0tICEhYmluYXJ5CisgICAgYmluYXJ5IGRhdGEgZW5jb2RlZCBpbiBiYXNlNjQgc2hvdWxkIGJlIGhlcmUuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtYmxvY2stc2NhbGFyLWluZGljYXRvci5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtYmxvY2stc2NhbGFyLWluZGljYXRvci5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNmRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1ibG9jay1zY2FsYXItaW5kaWNhdG9yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKy0tLSA+IHdoYXQgaXMgdGhpcz8gICMgYSBjb21tZW50CitkYXRhCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtY2hhcmFjdGVyLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1jaGFyYWN0ZXIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjg3YjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtY2hhcmFjdGVyLmxvYWRlci1lcnJvcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtY2hhcmFjdGVyLnN0cmVhbS1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1jaGFyYWN0ZXIuc3RyZWFtLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MWZhY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtY2hhcmFjdGVyLnN0cmVhbS1lcnJvcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtZGlyZWN0aXZlLWxpbmUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWRpcmVjdGl2ZS1saW5lLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkyZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWRpcmVjdGl2ZS1saW5lLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKyVZQU1MICAgMS4xID8gICAjIGV4dHJhIHN5bWJvbAorLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtZGlyZWN0aXZlLW5hbWUtMS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtZGlyZWN0aXZlLW5hbWUtMS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzZmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1kaXJlY3RpdmUtbmFtZS0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKyUgICAjIG5vIG5hbWUgYXQgYWxsCistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1kaXJlY3RpdmUtbmFtZS0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1kaXJlY3RpdmUtbmFtZS0yLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMyYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWRpcmVjdGl2ZS1uYW1lLTIubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJWludmFsaWQtY2hhcmFjdGVyczppbi1kaXJlY3RpdmUgbmFtZQorLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtZXNjYXBlLWNoYXJhY3Rlci5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtZXNjYXBlLWNoYXJhY3Rlci5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1YWI3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1lc2NhcGUtY2hhcmFjdGVyLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACisic29tZSBlc2NhcGUgY2hhcmFjdGVycyBhcmUgXG5jb3JyZWN0LCBidXQgdGhpcyBvbmUgXD9cbmlzIG5vdFxuIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLWVzY2FwZS1udW1iZXJzLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1lc2NhcGUtbnVtYmVycy5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ZWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1lc2NhcGUtbnVtYmVycy5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorImhtLi4uLiBcdTEyMz8iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtaW5kZW50YXRpb24taW5kaWNhdG9yLTEubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWluZGVudGF0aW9uLWluZGljYXRvci0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2NkMTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWluZGVudGF0aW9uLWluZGljYXRvci0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKy0tLSA+MCAgIyBub3QgdmFsaWQKK2RhdGEKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1pbmRlbnRhdGlvbi1pbmRpY2F0b3ItMi5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtaW5kZW50YXRpb24taW5kaWNhdG9yLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtaW5kZW50YXRpb24taW5kaWNhdG9yLTIubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorLS0tID4tMAorZGF0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLWl0ZW0td2l0aG91dC10cmFpbGluZy1icmVhay5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtaXRlbS13aXRob3V0LXRyYWlsaW5nLWJyZWFrLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNmNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLWl0ZW0td2l0aG91dC10cmFpbGluZy1icmVhay5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwyIEBACistCistMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1tZXJnZS0xLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1tZXJnZS0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzNjMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLW1lcmdlLTEubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorZm9vOiBiYXIKKzw8OiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1tZXJnZS0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1tZXJnZS0yLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg4NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLW1lcmdlLTIubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorZm9vOiBiYXIKKzw8OiBbeDogMSwgeTogMiwgeiwgdDogNF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1vbWFwLTEubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLW9tYXAtMS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MzM5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1vbWFwLTEubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorLS0tICEhb21hcAorZm9vOiBiYXIKK2JhejogYmF0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtb21hcC0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1vbWFwLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzdkZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtb21hcC0yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDMgQEAKKy0tLSAhIW9tYXAKKy0gZm9vOiBiYXIKKy0gYmF6CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtb21hcC0zLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1vbWFwLTMubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGY1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtb21hcC0zLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDQgQEAKKy0tLSAhIW9tYXAKKy0gZm9vOiBiYXIKKy0gYmF6OiBiYXIKKyAgYmFyOiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1wYWlycy0xLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1wYWlycy0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQxOWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXBhaXJzLTEubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorLS0tICEhcGFpcnMKK2ZvbzogYmFyCitiYXo6IGJhdApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXBhaXJzLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXBhaXJzLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzg5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtcGFpcnMtMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACistLS0gISFwYWlycworLSBmb286IGJhcgorLSBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1wYWlycy0zLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1wYWlycy0zLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ3NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXBhaXJzLTMubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsNCBAQAorLS0tICEhcGFpcnMKKy0gZm9vOiBiYXIKKy0gYmF6OiBiYXIKKyAgYmFyOiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tYnl0ZXMtMi1weTMubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1ieXRlcy0yLXB5My5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzYWY1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tYnl0ZXMtMi1weTMubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorLS0tICEhcHl0aG9uL2J5dGVzCisgICAg0LTQstC+0LjRh9C90YvQtSDQtNCw0L3QvdGL0LUg0LIgYmFzZTY0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLWJ5dGVzLXB5My5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLWJ5dGVzLXB5My5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5ZGZkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tYnl0ZXMtcHkzLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKy0tLSAhIXB5dGhvbi9ieXRlcworICAgIGJpbmFyeSBkYXRhIGVuY29kZWQgaW4gYmFzZTY0IHNob3VsZCBiZSBoZXJlLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1tb2R1bGUta2luZC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW1vZHVsZS1raW5kLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcxY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1tb2R1bGUta2luZC5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICEhcHl0aG9uL21vZHVsZTpzeXMgeyBtdXN0LCBiZSwgc2NhbGFyIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbW9kdWxlLXZhbHVlLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbW9kdWxlLXZhbHVlLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc5N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1tb2R1bGUtdmFsdWUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9tb2R1bGU6c3lzICJub24tZW1wdHkgdmFsdWUiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW1vZHVsZS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW1vZHVsZS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNDA3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbW9kdWxlLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vbW9kdWxlOm5vLnN1Y2gubW9kdWxlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW5hbWUta2luZC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW5hbWUta2luZC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmOGViNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1raW5kLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gISFweXRob24vbmFtZTpzeXMubW9kdWxlcyB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1uYW1lLW1vZHVsZS0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1tb2R1bGUtMi5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViYzMxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1tb2R1bGUtMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICEhcHl0aG9uL25hbWU6eG1sLnBhcnNlcnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1tb2R1bGUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1uYW1lLW1vZHVsZS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2NmY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1tb2R1bGUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9uYW1lOnN5cy5tb2R1bGVzLmtleXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1vYmplY3QubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXB5dGhvbi1uYW1lLW9iamVjdC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMzg2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS1vYmplY3QubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9uYW1lOm9zLnBhdGgucm1fcmYKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1weXRob24tbmFtZS12YWx1ZS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW5hbWUtdmFsdWUubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTE0MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtcHl0aG9uLW5hbWUtdmFsdWUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhIXB5dGhvbi9uYW1lOnN5cy5tb2R1bGVzIDUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC1zaW1wbGUta2V5LmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1zaW1wbGUta2V5LmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThkZWVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXNpbXBsZS1rZXkubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAora2V5OiB2YWx1ZQoraW52YWxpZCBzaW1wbGUga2V5CituZXh0IGtleTogbmV4dCB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXNpbmdsZS1xdW90ZS1idWcuY29kZSBiL3Rlc3RzL2RhdGEvaW52YWxpZC1zaW5nbGUtcXVvdGUtYnVnLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ODk0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC1zaW5nbGUtcXVvdGUtYnVnLmNvZGUKQEAgLTAsMCArMSBAQAorWyJmb28gJ2JhciciLCAiZm9vXG4nYmFyJyJdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtc2luZ2xlLXF1b3RlLWJ1Zy5kYXRhIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXNpbmdsZS1xdW90ZS1idWcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVmN2FlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXNpbmdsZS1xdW90ZS1idWcuZGF0YQpAQCAtMCwwICsxLDIgQEAKKy0gImZvbyAnYmFyJyIKKy0gImZvb1xuJ2JhciciCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtc3RhcnRpbmctY2hhcmFjdGVyLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC1zdGFydGluZy1jaGFyYWN0ZXIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODFjNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtc3RhcnRpbmctY2hhcmFjdGVyLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACitAQEBAQEBAQEBAQEBAQEBAQEBACmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLTEubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistICE8Zm9vI2Jhcj4gYmF6CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy0yLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM2NzAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy0yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistICFwcmVmaXghZm9vI2JhciBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctZGlyZWN0aXZlLWhhbmRsZS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWRpcmVjdGl2ZS1oYW5kbGUubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjVkN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWRpcmVjdGl2ZS1oYW5kbGUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVRBRyAhISEgISEhCistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctZGlyZWN0aXZlLXByZWZpeC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWRpcmVjdGl2ZS1wcmVmaXgubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWRpcmVjdGl2ZS1wcmVmaXgubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVRBRyAgICAhICAgdGFnOnp6LmNvbS9mb28jYmFyICAjICcjJyBpcyBub3QgYWxsb3dlZCBpbiBVUkxzCistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctaGFuZGxlLTEuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctaGFuZGxlLTEuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWRmOWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMS5lbWl0dGVyLWVycm9yCkBAIC0wLDAgKzEsNSBAQAorLSAhU3RyZWFtU3RhcnQKKy0gIURvY3VtZW50U3RhcnQgeyB0YWdzOiB7ICchZm9vJzogJ2JhcicgfSB9CistICFTY2FsYXIgeyB2YWx1ZTogJ2ZvbycgfQorLSAhRG9jdW1lbnRFbmQKKy0gIVN0cmVhbUVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWhhbmRsZS0xLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBkMTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwyIEBACislVEFHICAgIGZvbyBiYXIKKy0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMi5lbWl0dGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMi5lbWl0dGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtdGFnLWhhbmRsZS0yLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw1IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydCB7IHRhZ3M6IHsgJyEhISc6ICdiYXInIH0gfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdmb28nIH0KKy0gIURvY3VtZW50RW5kCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctaGFuZGxlLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXRhZy1oYW5kbGUtMi5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjN2YwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC10YWctaGFuZGxlLTIubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVRBRyAgICAhZm9vICAgIGJhcgorLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtdXJpLWVzY2FwZXMtMS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdXJpLWVzY2FwZXMtMS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlY2IzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC11cmktZXNjYXBlcy0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gITx0YWc6JXg/eT4gZm9vCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQtdXJpLWVzY2FwZXMtMi5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdXJpLWVzY2FwZXMtMi5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5ZThmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC11cmktZXNjYXBlcy0yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gITwlRkY+IGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXVyaS1lc2NhcGVzLTMubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXVyaS1lc2NhcGVzLTMubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTRjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQtdXJpLWVzY2FwZXMtMy5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICE8Zm9vJWQwJWFmJWQwJWFmJWQwYmFyPiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC11cmkubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXVyaS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzMDdlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC11cmkubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKKy0tLSAhZm9vISAgIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXV0ZjgtYnl0ZS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQtdXRmOC1ieXRlLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU4YzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXV0ZjgtYnl0ZS5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSw2NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitJbnZhbGlkIGJ5dGUgKCdceEZGJyk6IP8gPC0tCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC11dGY4LWJ5dGUuc3RyZWFtLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXV0ZjgtYnl0ZS5zdHJlYW0tZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1OGM3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC11dGY4LWJ5dGUuc3RyZWFtLWVycm9yCkBAIC0wLDAgKzEsNjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworSW52YWxpZCBieXRlICgnXHhGRicpOiD/IDwtLQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0xLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTEubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjRlM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDMgQEAKKyMgTm8gdmVyc2lvbiBhdCBhbGwuCislWUFNTAorLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0yLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTc3NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKyVZQU1MICAgMWUtNQorLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0zLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTMubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWU3ODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC1kaXJlY3RpdmUtdmVyc2lvbi0zLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKyVZQU1MIDEuCistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTQubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXlhbWwtZGlyZWN0aXZlLXZlcnNpb24tNC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1Y2E4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTQubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVlBTUwgMS4xMzIuNDM1CistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTUubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXlhbWwtZGlyZWN0aXZlLXZlcnNpb24tNS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTUubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVlBTUwgQS4wCistLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTYubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXlhbWwtZGlyZWN0aXZlLXZlcnNpb24tNi5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlNzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvaW52YWxpZC15YW1sLWRpcmVjdGl2ZS12ZXJzaW9uLTYubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorJVlBTUwgMTIzLkMKKy0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9pbnZhbGlkLXlhbWwtdmVyc2lvbi5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL2ludmFsaWQteWFtbC12ZXJzaW9uLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDAxOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9pbnZhbGlkLXlhbWwtdmVyc2lvbi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwyIEBACislWUFNTCAgIDIuMAorLS0tIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9sYXRpbi51bmljb2RlIGIvdGVzdHMvZGF0YS9sYXRpbi51bmljb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjc5OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL2xhdGluLnVuaWNvZGUKQEAgLTAsMCArMSwzODQgQEAKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CitBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6wqrCtcK6w4DDgcOCw4PDhMOFw4bDh8OIw4nDigorw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/xIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOCivEj8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7Ev8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZAKK8WRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb/GgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGkgorxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGvMa9xr7Gv8eEx4bHh8eJx4rHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecCivHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHs8e0x7XHtse3x7jHuce6x7vHvMe9x77Hv8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ8KK8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL/JgMmByZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7JrworybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7Kj8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq/Ohs6ICivOic6KzozOjs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz40KK8+Oz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Pr8+wz7HPss+zz7TPtc+3z7jPuc+6z7vPvM+9z77Pv9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkQor0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGTCivRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/0oDSgdKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p0KK9Ke0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToAor06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9Sx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJCivVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vr9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCrQor4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSpCivhtKrhtKvhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbnhtbrhtbvhtbzhtb3htb7htb/htoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhuIDhuIHhuILhuIPhuIThuIXhuIbhuIcKK+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4v+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5iQor4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqLCivhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhuqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur/hu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5EKK+G7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8mOG8meG8muG8mwor4byc4byd4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/4b2A4b2B4b2C4b2D4b2E4b2F4b2I4b2J4b2K4b2L4b2M4b2N4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Z4b2b4b2d4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2nCivhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvrDhvrHhvrLhvrPhvrThvrbhvrfhvrjhvrnhvrrhvrvhvr7hv4Lhv4Phv4Thv4bhv4fhv4jhv4nhv4oKK+G/i+G/kOG/keG/kuG/k+G/luG/l+G/mOG/meG/muG/m+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/suG/s+G/tOG/tuG/t+G/uOG/ueG/uuG/u+KBseKBv+KEguKEh+KEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KEleKEmeKEmuKEm+KEnOKEneKEpOKEpuKEqOKEquKEq+KErOKEreKEr+KEsOKEseKEs+KEtOKEuQorQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5esKqwrXCusOAw4HDgsODw4TDhcOGw4fDiMOJw4oKK8OLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7jDucO6w7vDvMO9w77Dv8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjgorxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL/FgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQCivFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/xoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpIKK8aTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrzGvca+xr/HhMeGx4fHiceKx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnAorx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x7/IgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifCivIoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/yYDJgcmQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya8KK8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo/KkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvzobOiAorzonOis6Mzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+NCivPjs+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz6/PsM+xz7LPs8+0z7XPt8+4z7nPus+7z7zPvc++z7/QgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JEKK9CS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRkwor0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rv9KA0oHSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKdCivSntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Sv9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06AKK9Oh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO51IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjViQor1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a/VsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq0KK+GCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheG0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qQor4bSq4bSr4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW54bW64bW74bW84bW94bW+4bW/4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4biA4biB4biC4biD4biE4biF4biG4biHCivhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL/huYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYkKK+G5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5v+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6iwor4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buRCivhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJjhvJnhvJrhvJsKK+G8nOG8neG8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8v+G9gOG9geG9guG9g+G9hOG9heG9iOG9ieG9iuG9i+G9jOG9jeG9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9meG9m+G9neG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9pwor4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6w4b6x4b6y4b6z4b604b624b634b644b654b664b674b6+4b+C4b+D4b+E4b+G4b+H4b+I4b+J4b+KCivhv4vhv5Dhv5Hhv5Lhv5Phv5bhv5fhv5jhv5nhv5rhv5vhv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv7Lhv7Phv7Thv7bhv7fhv7jhv7nhv7rhv7vigbHigb/ihILihIfihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJXihJnihJrihJvihJzihJ3ihKTihKbihKjihKrihKvihKzihK3ihK/ihLDihLHihLPihLTihLkKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CitBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6wqrCtcK6w4DDgcOCw4PDhMOFw4bDh8OIw4nDigorw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/xIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOCivEj8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7Ev8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZAKK8WRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb/GgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGkgorxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGvMa9xr7Gv8eEx4bHh8eJx4rHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecCivHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHs8e0x7XHtse3x7jHuce6x7vHvMe9x77Hv8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ8KK8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL/JgMmByZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7JrworybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7Kj8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq/Ohs6ICivOic6KzozOjs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz40KK8+Oz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Pr8+wz7HPss+zz7TPtc+3z7jPuc+6z7vPvM+9z77Pv9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkQor0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGTCivRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/0oDSgdKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p0KK9Ke0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToAor06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9Sx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJCivVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vr9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCrQor4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSpCivhtKrhtKvhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbnhtbrhtbvhtbzhtb3htb7htb/htoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhuIDhuIHhuILhuIPhuIThuIXhuIbhuIcKK+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4v+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5iQor4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqLCivhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhuqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur/hu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5EKK+G7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8mOG8meG8muG8mwor4byc4byd4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/4b2A4b2B4b2C4b2D4b2E4b2F4b2I4b2J4b2K4b2L4b2M4b2N4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Z4b2b4b2d4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2nCivhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvrDhvrHhvrLhvrPhvrThvrbhvrfhvrjhvrnhvrrhvrvhvr7hv4Lhv4Phv4Thv4bhv4fhv4jhv4nhv4oKK+G/i+G/kOG/keG/kuG/k+G/luG/l+G/mOG/meG/muG/m+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/suG/s+G/tOG/tuG/t+G/uOG/ueG/uuG/u+KBseKBv+KEguKEh+KEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KEleKEmeKEmuKEm+KEnOKEneKEpOKEpuKEqOKEquKEq+KErOKEreKEr+KEsOKEseKEs+KEtOKEuQorQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5esKqwrXCusOAw4HDgsODw4TDhcOGw4fDiMOJw4oKK8OLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7jDucO6w7vDvMO9w77Dv8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjgorxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL/FgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQCivFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/xoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpIKK8aTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrzGvca+xr/HhMeGx4fHiceKx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnAorx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x7/IgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifCivIoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/yYDJgcmQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya8KK8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo/KkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvzobOiAorzonOis6Mzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+NCivPjs+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz6/PsM+xz7LPs8+0z7XPt8+4z7nPus+7z7zPvc++z7/QgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JEKK9CS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRkwor0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rv9KA0oHSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKdCivSntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Sv9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06AKK9Oh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO51IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjViQor1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a/VsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq0KK+GCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheG0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qQor4bSq4bSr4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW54bW64bW74bW84bW94bW+4bW/4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4biA4biB4biC4biD4biE4biF4biG4biHCivhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL/huYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYkKK+G5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5v+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6iwor4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buRCivhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJjhvJnhvJrhvJsKK+G8nOG8neG8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8v+G9gOG9geG9guG9g+G9hOG9heG9iOG9ieG9iuG9i+G9jOG9jeG9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9meG9m+G9neG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9pwor4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6w4b6x4b6y4b6z4b604b624b634b644b654b664b674b6+4b+C4b+D4b+E4b+G4b+H4b+I4b+J4b+KCivhv4vhv5Dhv5Hhv5Lhv5Phv5bhv5fhv5jhv5nhv5rhv5vhv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv7Lhv7Phv7Thv7bhv7fhv7jhv7nhv7rhv7vigbHigb/ihILihIfihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJXihJnihJrihJvihJzihJ3ihKTihKbihKjihKrihKvihKzihK3ihK/ihLDihLHihLPihLTihLkKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CitBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6wqrCtcK6w4DDgcOCw4PDhMOFw4bDh8OIw4nDigorw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/xIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOCivEj8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7Ev8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZAKK8WRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb/GgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGkgorxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGvMa9xr7Gv8eEx4bHh8eJx4rHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecCivHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHs8e0x7XHtse3x7jHuce6x7vHvMe9x77Hv8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ8KK8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL/JgMmByZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7JrworybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7Kj8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq/Ohs6ICivOic6KzozOjs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz40KK8+Oz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Pr8+wz7HPss+zz7TPtc+3z7jPuc+6z7vPvM+9z77Pv9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkQor0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGTCivRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/0oDSgdKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p0KK9Ke0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToAor06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9Sx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJCivVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vr9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCrQor4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSpCivhtKrhtKvhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbnhtbrhtbvhtbzhtb3htb7htb/htoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhuIDhuIHhuILhuIPhuIThuIXhuIbhuIcKK+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4v+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5iQor4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqLCivhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhuqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur/hu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5EKK+G7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8mOG8meG8muG8mwor4byc4byd4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/4b2A4b2B4b2C4b2D4b2E4b2F4b2I4b2J4b2K4b2L4b2M4b2N4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Z4b2b4b2d4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2nCivhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvrDhvrHhvrLhvrPhvrThvrbhvrfhvrjhvrnhvrrhvrvhvr7hv4Lhv4Phv4Thv4bhv4fhv4jhv4nhv4oKK+G/i+G/kOG/keG/kuG/k+G/luG/l+G/mOG/meG/muG/m+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/suG/s+G/tOG/tuG/t+G/uOG/ueG/uuG/u+KBseKBv+KEguKEh+KEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KEleKEmeKEmuKEm+KEnOKEneKEpOKEpuKEqOKEquKEq+KErOKEreKEr+KEsOKEseKEs+KEtOKEuQorQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5esKqwrXCusOAw4HDgsODw4TDhcOGw4fDiMOJw4oKK8OLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7jDucO6w7vDvMO9w77Dv8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjgorxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL/FgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQCivFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/xoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpIKK8aTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrzGvca+xr/HhMeGx4fHiceKx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnAorx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x7/IgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifCivIoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/yYDJgcmQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya8KK8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo/KkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvzobOiAorzonOis6Mzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+NCivPjs+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz6/PsM+xz7LPs8+0z7XPt8+4z7nPus+7z7zPvc++z7/QgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JEKK9CS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRkwor0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rv9KA0oHSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKdCivSntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Sv9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06AKK9Oh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO51IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjViQor1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a/VsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq0KK+GCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheG0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qQor4bSq4bSr4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW54bW64bW74bW84bW94bW+4bW/4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4biA4biB4biC4biD4biE4biF4biG4biHCivhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL/huYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYkKK+G5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5v+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6iwor4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buRCivhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJjhvJnhvJrhvJsKK+G8nOG8neG8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8v+G9gOG9geG9guG9g+G9hOG9heG9iOG9ieG9iuG9i+G9jOG9jeG9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9meG9m+G9neG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9pwor4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6w4b6x4b6y4b6z4b604b624b634b644b654b664b674b6+4b+C4b+D4b+E4b+G4b+H4b+I4b+J4b+KCivhv4vhv5Dhv5Hhv5Lhv5Phv5bhv5fhv5jhv5nhv5rhv5vhv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv7Lhv7Phv7Thv7bhv7fhv7jhv7nhv7rhv7vigbHigb/ihILihIfihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJXihJnihJrihJvihJzihJ3ihKTihKbihKjihKrihKvihKzihK3ihK/ihLDihLHihLPihLTihLkKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CitBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6wqrCtcK6w4DDgcOCw4PDhMOFw4bDh8OIw4nDigorw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/xIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOCivEj8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7Ev8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZAKK8WRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb/GgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGkgorxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGvMa9xr7Gv8eEx4bHh8eJx4rHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecCivHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHs8e0x7XHtse3x7jHuce6x7vHvMe9x77Hv8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ8KK8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL/JgMmByZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7JrworybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7Kj8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq/Ohs6ICivOic6KzozOjs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz40KK8+Oz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Pr8+wz7HPss+zz7TPtc+3z7jPuc+6z7vPvM+9z77Pv9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkQor0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGTCivRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/0oDSgdKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p0KK9Ke0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToAor06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9Sx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJCivVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vr9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCrQor4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSpCivhtKrhtKvhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbnhtbrhtbvhtbzhtb3htb7htb/htoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhuIDhuIHhuILhuIPhuIThuIXhuIbhuIcKK+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4v+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5iQor4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqLCivhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhuqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur/hu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5EKK+G7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8mOG8meG8muG8mwor4byc4byd4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/4b2A4b2B4b2C4b2D4b2E4b2F4b2I4b2J4b2K4b2L4b2M4b2N4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Z4b2b4b2d4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2nCivhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvrDhvrHhvrLhvrPhvrThvrbhvrfhvrjhvrnhvrrhvrvhvr7hv4Lhv4Phv4Thv4bhv4fhv4jhv4nhv4oKK+G/i+G/kOG/keG/kuG/k+G/luG/l+G/mOG/meG/muG/m+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/suG/s+G/tOG/tuG/t+G/uOG/ueG/uuG/u+KBseKBv+KEguKEh+KEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KEleKEmeKEmuKEm+KEnOKEneKEpOKEpuKEqOKEquKEq+KErOKEreKEr+KEsOKEseKEs+KEtOKEuQorQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5esKqwrXCusOAw4HDgsODw4TDhcOGw4fDiMOJw4oKK8OLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7jDucO6w7vDvMO9w77Dv8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjgorxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL/FgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQCivFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/xoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpIKK8aTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrzGvca+xr/HhMeGx4fHiceKx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnAorx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x7/IgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifCivIoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/yYDJgcmQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya8KK8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo/KkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvzobOiAorzonOis6Mzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+NCivPjs+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz6/PsM+xz7LPs8+0z7XPt8+4z7nPus+7z7zPvc++z7/QgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JEKK9CS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRkwor0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rv9KA0oHSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKdCivSntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Sv9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06AKK9Oh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO51IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjViQor1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a/VsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq0KK+GCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheG0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qQor4bSq4bSr4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW54bW64bW74bW84bW94bW+4bW/4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4biA4biB4biC4biD4biE4biF4biG4biHCivhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL/huYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYkKK+G5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5v+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6iwor4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buRCivhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJjhvJnhvJrhvJsKK+G8nOG8neG8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8v+G9gOG9geG9guG9g+G9hOG9heG9iOG9ieG9iuG9i+G9jOG9jeG9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9meG9m+G9neG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9pwor4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6w4b6x4b6y4b6z4b604b624b634b644b654b664b674b6+4b+C4b+D4b+E4b+G4b+H4b+I4b+J4b+KCivhv4vhv5Dhv5Hhv5Lhv5Phv5bhv5fhv5jhv5nhv5rhv5vhv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv7Lhv7Phv7Thv7bhv7fhv7jhv7nhv7rhv7vigbHigb/ihILihIfihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJXihJnihJrihJvihJzihJ3ihKTihKbihKjihKrihKvihKzihK3ihK/ihLDihLHihLPihLTihLkKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CitBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6wqrCtcK6w4DDgcOCw4PDhMOFw4bDh8OIw4nDigorw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/xIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOCivEj8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7Ev8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZAKK8WRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb/GgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGkgorxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGvMa9xr7Gv8eEx4bHh8eJx4rHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecCivHnceex5/HoMehx6LHo8ekx6XHpsenx6jHqceqx6vHrMetx67Hr8ewx7HHs8e0x7XHtse3x7jHuce6x7vHvMe9x77Hv8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ8KK8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL/JgMmByZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7JrworybDJscmyybPJtMm1ybbJt8m4ybnJusm7ybzJvcm+yb/KgMqByoLKg8qEyoXKhsqHyojKicqKyovKjMqNyo7Kj8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq/Ohs6ICivOic6KzozOjs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz40KK8+Oz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Pr8+wz7HPss+zz7TPtc+3z7jPuc+6z7vPvM+9z77Pv9CA0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkQor0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9GQ0ZHRktGTCivRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/0oDSgdKK0ovSjNKN0o7Sj9KQ0pHSktKT0pTSldKW0pfSmNKZ0prSm9Kc0p0KK9Ke0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/04DTgdOC04PThNOF04bTh9OI04nTitOL04zTjdOO05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToAor06HTotOj06TTpdOm06fTqNOp06rTq9Os063TrtOv07DTsdOy07PTtNO107bTt9O407nUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9Sx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJCivVitWL1YzVjdWO1Y/VkNWR1ZLVk9WU1ZXVltWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vr9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCrQor4YKu4YKv4YKw4YKx4YKy4YKz4YK04YK14YK24YK34YK44YK54YK64YK74YK84YK94YK+4YK/4YOA4YOB4YOC4YOD4YOE4YOF4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSpCivhtKrhtKvhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbnhtbrhtbvhtbzhtb3htb7htb/htoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhuIDhuIHhuILhuIPhuIThuIXhuIbhuIcKK+G4iOG4ieG4iuG4i+G4jOG4jeG4juG4j+G4kOG4keG4kuG4k+G4lOG4leG4luG4l+G4mOG4meG4muG4m+G4nOG4neG4nuG4n+G4oOG4oeG4ouG4o+G4pOG4peG4puG4p+G4qOG4qeG4quG4q+G4rOG4reG4ruG4r+G4sOG4seG4suG4s+G4tOG4teG4tuG4t+G4uOG4ueG4uuG4u+G4vOG4veG4vuG4v+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5iQor4bmK4bmL4bmM4bmN4bmO4bmP4bmQ4bmR4bmS4bmT4bmU4bmV4bmW4bmX4bmY4bmZ4bma4bmb4bmc4bmd4bme4bmf4bmg4bmh4bmi4bmj4bmk4bml4bmm4bmn4bmo4bmp4bmq4bmr4bms4bmt4bmu4bmv4bmw4bmx4bmy4bmz4bm04bm14bm24bm34bm44bm54bm64bm74bm84bm94bm+4bm/4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqLCivhuozhuo3huo7huo/hupDhupHhupLhupPhupThupXhupbhupfhupjhupnhuprhupvhuqDhuqHhuqLhuqPhuqThuqXhuqbhuqfhuqjhuqnhuqrhuqvhuqzhuq3huq7huq/hurDhurHhurLhurPhurThurXhurbhurfhurjhurnhurrhurvhurzhur3hur7hur/hu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5EKK+G7kuG7k+G7lOG7leG7luG7l+G7mOG7meG7muG7m+G7nOG7neG7nuG7n+G7oOG7oeG7ouG7o+G7pOG7peG7puG7p+G7qOG7qeG7quG7q+G7rOG7reG7ruG7r+G7sOG7seG7suG7s+G7tOG7teG7tuG7t+G7uOG7ueG8gOG8geG8guG8g+G8hOG8heG8huG8h+G8iOG8ieG8iuG8i+G8jOG8jeG8juG8j+G8kOG8keG8kuG8k+G8lOG8leG8mOG8meG8muG8mwor4byc4byd4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/4b2A4b2B4b2C4b2D4b2E4b2F4b2I4b2J4b2K4b2L4b2M4b2N4b2Q4b2R4b2S4b2T4b2U4b2V4b2W4b2X4b2Z4b2b4b2d4b2f4b2g4b2h4b2i4b2j4b2k4b2l4b2m4b2nCivhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvoDhvoHhvoLhvoPhvoThvoXhvobhvofhvpDhvpHhvpLhvpPhvpThvpXhvpbhvpfhvqDhvqHhvqLhvqPhvqThvqXhvqbhvqfhvrDhvrHhvrLhvrPhvrThvrbhvrfhvrjhvrnhvrrhvrvhvr7hv4Lhv4Phv4Thv4bhv4fhv4jhv4nhv4oKK+G/i+G/kOG/keG/kuG/k+G/luG/l+G/mOG/meG/muG/m+G/oOG/oeG/ouG/o+G/pOG/peG/puG/p+G/qOG/qeG/quG/q+G/rOG/suG/s+G/tOG/tuG/t+G/uOG/ueG/uuG/u+KBseKBv+KEguKEh+KEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KEleKEmeKEmuKEm+KEnOKEneKEpOKEpuKEqOKEquKEq+KErOKEreKEr+KEsOKEseKEs+KEtOKEuQorQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5esKqwrXCusOAw4HDgsODw4TDhcOGw4fDiMOJw4oKK8OLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7jDucO6w7vDvMO9w77Dv8SAxIHEgsSDxITEhcSGxIfEiMSJxIrEi8SMxI3EjgorxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL/FgMWBxYLFg8WExYXFhsWHxYjFicWKxYvFjMWNxY7Fj8WQCivFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/xoDGgcaCxoPGhMaFxobGh8aIxonGisaLxozGjcaOxo/GkMaRxpIKK8aTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrzGvca+xr/HhMeGx4fHiceKx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnAorx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x7/IgMiByILIg8iEyIXIhsiHyIjIiciKyIvIjMiNyI7Ij8iQyJHIksiTyJTIlciWyJfImMiZyJrIm8icyJ3InsifCivIoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/yYDJgcmQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya8KK8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo/KkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvzobOiAorzonOis6Mzo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+NCivPjs+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz6/PsM+xz7LPs8+0z7XPt8+4z7nPus+7z7zPvc++z7/QgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JEKK9CS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRkwor0ZTRldGW0ZfRmNGZ0ZrRm9Gc0Z3RntGf0aDRodGi0aPRpNGl0abRp9Go0anRqtGr0azRrdGu0a/RsNGx0bLRs9G00bXRttG30bjRudG60bvRvNG90b7Rv9KA0oHSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKdCivSntKf0qDSodKi0qPSpNKl0qbSp9Ko0qnSqtKr0qzSrdKu0q/SsNKx0rLSs9K00rXSttK30rjSudK60rvSvNK90r7Sv9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06AKK9Oh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO51IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjViQor1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a/VsNWx1bLVs9W01bXVttW31bjVudW61bvVvNW91b7Vv9aA1oHWgtaD1oTWhdaG1ofhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq0KK+GCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheG0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qQor4bSq4bSr4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW54bW64bW74bW84bW94bW+4bW/4baA4baB4baC4baD4baE4baF4baG4baH4baI4baJ4baK4baL4baM4baN4baO4baP4baQ4baR4baS4baT4baU4baV4baW4baX4baY4baZ4baa4biA4biB4biC4biD4biE4biF4biG4biHCivhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL/huYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYkKK+G5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5v+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6iwor4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buRCivhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJjhvJnhvJrhvJsKK+G8nOG8neG8oOG8oeG8ouG8o+G8pOG8peG8puG8p+G8qOG8qeG8quG8q+G8rOG8reG8ruG8r+G8sOG8seG8suG8s+G8tOG8teG8tuG8t+G8uOG8ueG8uuG8u+G8vOG8veG8vuG8v+G9gOG9geG9guG9g+G9hOG9heG9iOG9ieG9iuG9i+G9jOG9jeG9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9meG9m+G9neG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9pwor4b2o4b2p4b2q4b2r4b2s4b2t4b2u4b2v4b2w4b2x4b2y4b2z4b204b214b224b234b244b254b264b274b284b294b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6w4b6x4b6y4b6z4b604b624b634b644b654b664b674b6+4b+C4b+D4b+E4b+G4b+H4b+I4b+J4b+KCivhv4vhv5Dhv5Hhv5Lhv5Phv5bhv5fhv5jhv5nhv5rhv5vhv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv7Lhv7Phv7Thv7bhv7fhv7jhv7nhv7rhv7vigbHigb/ihILihIfihIrihIvihIzihI3ihI7ihI/ihJDihJHihJLihJPihJXihJnihJrihJvihJzihJ3ihKTihKbihKjihKrihKvihKzihK3ihK/ihLDihLHihLPihLTihLkKK0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXrCqsK1wrrDgMOBw4LDg8OEw4XDhsOHw4jDicOKCivDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/EgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI4KK8SPxJDEkcSSxJPElMSVxJbEl8SYxJnEmsSbxJzEncSexJ/EoMShxKLEo8SkxKXEpsSnxKjEqcSqxKvErMStxK7Er8SwxLHEssSzxLTEtcS2xLfEuMS5xLrEu8S8xL3EvsS/xYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkAorxZHFksWTxZTFlcWWxZfFmMWZxZrFm8WcxZ3FnsWfxaDFocWixaPFpMWlxabFp8WoxanFqsWrxazFrcWuxa/FsMWxxbLFs8W0xbXFtsW3xbjFucW6xbvFvMW9xb7Fv8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSCivGk8aUxpXGlsaXxpjGmcaaxpvGnMadxp7Gn8agxqHGosajxqTGpcamxqfGqMapxqrGq8asxq3GrsavxrDGscayxrPGtMa1xrbGt8a4xrnGusa8xr3Gvsa/x4THhseHx4nHiseMx43HjsePx5DHkceSx5PHlMeVx5bHl8eYx5nHmsebx5wKK8edx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHscezx7THtce2x7fHuMe5x7rHu8e8x73Hvse/yIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7InworyKDIociiyKPIpMilyKbIp8ioyKnIqsiryKzIrciuyK/IsMixyLLIs8i0yLXItsi3yLjIuci6yLvIvMi9yL7Iv8mAyYHJkMmRyZLJk8mUyZXJlsmXyZjJmcmayZvJnMmdyZ7Jn8mgyaHJosmjyaTJpcmmyafJqMmpyarJq8msya3JrsmvCivJsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPypDKkcqSypPKlMqVypbKl8qYypnKmsqbypzKncqeyp/KoMqhyqLKo8qkyqXKpsqnyqjKqcqqyqvKrMqtyq7Kr86GzogKK86JzorOjM6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjQorz47PkM+Rz5LPk8+Uz5XPls+Xz5jPmc+az5vPnM+dz57Pn8+gz6HPos+jz6TPpc+mz6fPqM+pz6rPq8+sz63Prs+vz7DPsc+yz7PPtM+1z7fPuM+5z7rPu8+8z73Pvs+/0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCRCivQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZMKK9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b/SgNKB0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSnQor0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r/TgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047TkNOR05LTk9OU05XTltOX05jTmdOa05vTnNOd057Tn9OgCivTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudSA1IHUgtSD1ITUhdSG1IfUiNSJ1IrUi9SM1I3UjtSP1LHUstSz1LTUtdS21LfUuNS51LrUu9S81L3UvtS/1YDVgdWC1YPVhNWF1YbVh9WI1YkKK9WK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1aHVotWj1aTVpdWm1afVqNWp1arVq9Ws1a3VrtWv1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH4YKg4YKh4YKi4YKj4YKk4YKl4YKm4YKn4YKo4YKp4YKq4YKr4YKs4YKtCivhgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4XhtIDhtIHhtILhtIPhtIThtIXhtIbhtIfhtIjhtInhtIrhtIvhtIzhtI3htI7htI/htJDhtJHhtJLhtJPhtJThtJXhtJbhtJfhtJjhtJnhtJrhtJvhtJzhtJ3htJ7htJ/htKDhtKHhtKLhtKPhtKThtKXhtKbhtKfhtKjhtKkKK+G0quG0q+G1ouG1o+G1pOG1peG1puG1p+G1qOG1qeG1quG1q+G1rOG1reG1ruG1r+G1sOG1seG1suG1s+G1tOG1teG1tuG1t+G1ueG1uuG1u+G1vOG1veG1vuG1v+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG4gOG4geG4guG4g+G4hOG4heG4huG4hwor4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/4bmA4bmB4bmC4bmD4bmE4bmF4bmG4bmH4bmI4bmJCivhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub/huoDhuoHhuoLhuoPhuoThuoXhuobhuofhuojhuonhuorhuosKK+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6v+G7gOG7geG7guG7g+G7hOG7heG7huG7h+G7iOG7ieG7iuG7i+G7jOG7jeG7juG7j+G7kOG7kQor4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byY4byZ4bya4bybCivhvJzhvJ3hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL/hvYDhvYHhvYLhvYPhvYThvYXhvYjhvYnhvYrhvYvhvYzhvY3hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZnhvZvhvZ3hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvacKK+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG+gOG+geG+guG+g+G+hOG+heG+huG+h+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+sOG+seG+suG+s+G+tOG+tuG+t+G+uOG+ueG+uuG+u+G+vuG/guG/g+G/hOG/huG/h+G/iOG/ieG/igor4b+L4b+Q4b+R4b+S4b+T4b+W4b+X4b+Y4b+Z4b+a4b+b4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+y4b+z4b+04b+24b+34b+44b+54b+64b+74oGx4oG/4oSC4oSH4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSV4oSZ4oSa4oSb4oSc4oSd4oSk4oSm4oSo4oSq4oSr4oSs4oSt4oSv4oSw4oSx4oSz4oS04oS5CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL21hcHBpbmdzLmV2ZW50cyBiL3Rlc3RzL2RhdGEvbWFwcGluZ3MuZXZlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjU1NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL21hcHBpbmdzLmV2ZW50cwpAQCAtMCwwICsxLDQ0IEBACistICFTdHJlYW1TdGFydAorCistICFEb2N1bWVudFN0YXJ0CistICFNYXBwaW5nU3RhcnQKKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdrZXknIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICd2YWx1ZScgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2VtcHR5IG1hcHBpbmcnIH0KKy0gIU1hcHBpbmdTdGFydAorLSAhTWFwcGluZ0VuZAorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2VtcHR5IG1hcHBpbmcgd2l0aCB0YWcnIH0KKy0gIU1hcHBpbmdTdGFydCB7IHRhZzogJyFteXRhZycsIGltcGxpY2l0OiBmYWxzZSB9CistICFNYXBwaW5nRW5kCistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnYmxvY2sgbWFwcGluZycgfQorLSAhTWFwcGluZ1N0YXJ0CistICFNYXBwaW5nU3RhcnQKKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdjb21wbGV4JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAna2V5JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnY29tcGxleCcgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2tleScgfQorLSAhTWFwcGluZ0VuZAorLSAhTWFwcGluZ1N0YXJ0CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnY29tcGxleCcgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2tleScgfQorLSAhTWFwcGluZ0VuZAorLSAhTWFwcGluZ0VuZAorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2Zsb3cgbWFwcGluZycgfQorLSAhTWFwcGluZ1N0YXJ0IHsgZmxvd19zdHlsZTogdHJ1ZSB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAna2V5JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAndmFsdWUnIH0KKy0gIU1hcHBpbmdTdGFydAorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2NvbXBsZXgnIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdrZXknIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdjb21wbGV4JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAna2V5JyB9CistICFNYXBwaW5nRW5kCistICFNYXBwaW5nU3RhcnQKKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdjb21wbGV4JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAna2V5JyB9CistICFNYXBwaW5nRW5kCistICFNYXBwaW5nRW5kCistICFNYXBwaW5nRW5kCistICFEb2N1bWVudEVuZAorCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbWVyZ2UuZGF0YSBiL3Rlc3RzL2RhdGEvbWVyZ2UuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU1YmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9tZXJnZS5kYXRhCkBAIC0wLDAgKzEgQEAKKy0gPDwKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbWVyZ2UuZGV0ZWN0IGIvdGVzdHMvZGF0YS9tZXJnZS5kZXRlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MmQwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbWVyZ2UuZGV0ZWN0CkBAIC0wLDAgKzEgQEAKK3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL21vcmUtZmxvYXRzLmNvZGUgYi90ZXN0cy9kYXRhL21vcmUtZmxvYXRzLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlNDQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbW9yZS1mbG9hdHMuY29kZQpAQCAtMCwwICsxIEBACitbMC4wLCArMS4wLCAtMS4wLCArMWUzMDAwMDAsIC0xZTMwMDAwMCwgMWUzMDAwMDAvMWUzMDAwMDAsIC0oMWUzMDAwMDAvMWUzMDAwMDApXSAjIGxhc3QgdHdvIGl0ZW1zIGFyZSBpbmQgYW5kIHFuYW4gcmVzcGVjdGl2ZWx5LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9tb3JlLWZsb2F0cy5kYXRhIGIvdGVzdHMvZGF0YS9tb3JlLWZsb2F0cy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWViMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL21vcmUtZmxvYXRzLmRhdGEKQEAgLTAsMCArMSBAQAorWzAuMCwgKzEuMCwgLTEuMCwgKy5pbmYsIC0uaW5mLCAubmFuLCAubmFuXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uZWdhdGl2ZS1mbG9hdC1idWcuY29kZSBiL3Rlc3RzL2RhdGEvbmVnYXRpdmUtZmxvYXQtYnVnLmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMTZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbmVnYXRpdmUtZmxvYXQtYnVnLmNvZGUKQEAgLTAsMCArMSBAQAorLTEuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uZWdhdGl2ZS1mbG9hdC1idWcuZGF0YSBiL3Rlc3RzL2RhdGEvbmVnYXRpdmUtZmxvYXQtYnVnLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMTZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbmVnYXRpdmUtZmxvYXQtYnVnLmRhdGEKQEAgLTAsMCArMSBAQAorLTEuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uby1hbGlhcy1hbmNob3IuZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvbm8tYWxpYXMtYW5jaG9yLmVtaXR0ZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmMDY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbm8tYWxpYXMtYW5jaG9yLmVtaXR0ZXItZXJyb3IKQEAgLTAsMCArMSw4IEBACistICFTdHJlYW1TdGFydAorLSAhRG9jdW1lbnRTdGFydAorLSAhU2VxdWVuY2VTdGFydAorLSAhU2NhbGFyIHsgYW5jaG9yOiBBLCB2YWx1ZTogZGF0YSB9CistICFBbGlhcyB7IH0KKy0gIVNlcXVlbmNlRW5kCistICFEb2N1bWVudEVuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL25vLWFsaWFzLWFuY2hvci5za2lwLWV4dCBiL3Rlc3RzL2RhdGEvbm8tYWxpYXMtYW5jaG9yLnNraXAtZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL25vLWFsaWFzLWFuY2hvci5za2lwLWV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uby1ibG9jay1jb2xsZWN0aW9uLWVuZC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL25vLWJsb2NrLWNvbGxlY3Rpb24tZW5kLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ0ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9uby1ibG9jay1jb2xsZWN0aW9uLWVuZC5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACistIGZvbworLSBiYXIKK2JhejogYmFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL25vLWJsb2NrLW1hcHBpbmctZW5kLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9uby1ibG9jay1tYXBwaW5nLWVuZC0yLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTYzNTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9uby1ibG9jay1tYXBwaW5nLWVuZC0yLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDMgQEAKKz8gZm9vCis6IGJhcgorOiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbm8tYmxvY2stbWFwcGluZy1lbmQubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9uby1ibG9jay1tYXBwaW5nLWVuZC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhOTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbm8tYmxvY2stbWFwcGluZy1lbmQubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEgQEAKK2ZvbzogImJhciIgImJheiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbm8tZG9jdW1lbnQtc3RhcnQubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9uby1kb2N1bWVudC1zdGFydC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyNWVjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbm8tZG9jdW1lbnQtc3RhcnQubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorJVlBTUwgICAxLjEKKyMgbm8gLS0tCitmb286IGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uby1mbG93LW1hcHBpbmctZW5kLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvbm8tZmxvdy1tYXBwaW5nLWVuZC5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMTQwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbm8tZmxvdy1tYXBwaW5nLWVuZC5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAoreyBmb286IGJhciBdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL25vLWZsb3ctc2VxdWVuY2UtZW5kLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvbm8tZmxvdy1zZXF1ZW5jZS1lbmQubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGQ5NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL25vLWZsb3ctc2VxdWVuY2UtZW5kLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACitbZm9vLCBiYXJ9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL25vLW5vZGUtMS5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL25vLW5vZGUtMS5sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiMTUwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbm8tbm9kZS0xLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistICFmb28gXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9uby1ub2RlLTIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9uby1ub2RlLTIubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2UzYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL25vLW5vZGUtMi5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLSBbICFmb28gfSBdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL25vLXRhZy5lbWl0dGVyLWVycm9yIGIvdGVzdHMvZGF0YS9uby10YWcuZW1pdHRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRjNjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9uby10YWcuZW1pdHRlci1lcnJvcgpAQCAtMCwwICsxLDUgQEAKKy0gIVN0cmVhbVN0YXJ0CistICFEb2N1bWVudFN0YXJ0CistICFTY2FsYXIgeyB2YWx1ZTogJ2ZvbycsIGltcGxpY2l0OiBbZmFsc2UsZmFsc2VdIH0KKy0gIURvY3VtZW50RW5kCistICFTdHJlYW1FbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbnVsbC5kYXRhIGIvdGVzdHMvZGF0YS9udWxsLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxMjUyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvbnVsbC5kYXRhCkBAIC0wLDAgKzEsMyBAQAorLQorLSB+CistIG51bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvbnVsbC5kZXRlY3QgYi90ZXN0cy9kYXRhL251bGwuZGV0ZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTEwYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL251bGwuZGV0ZWN0CkBAIC0wLDAgKzEgQEAKK3RhZzp5YW1sLm9yZywyMDAyOm51bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvb2RkLXV0ZjE2LnN0cmVhbS1lcnJvciBiL3Rlc3RzL2RhdGEvb2RkLXV0ZjE2LnN0cmVhbS1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTllNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9vZGQtdXRmMTYuc3RyZWFtLWVycm9yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLWFuY2hvci5mb3JtZXItbG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9yZWN1cnNpdmUtYW5jaG9yLmZvcm1lci1sb2FkZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLWFuY2hvci5mb3JtZXItbG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsNCBAQAorLSAmZm9vIFsxCisgICAgMiwKKyAgICAzLAorICAgICpmb29dCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1kaWN0LnJlY3Vyc2l2ZSBiL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLWRpY3QucmVjdXJzaXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1kaWN0LnJlY3Vyc2l2ZQpAQCAtMCwwICsxLDMgQEAKK3ZhbHVlID0ge30KK2luc3RhbmNlID0gQW5JbnN0YW5jZSh2YWx1ZSwgdmFsdWUpCit2YWx1ZVtpbnN0YW5jZV0gPSBpbnN0YW5jZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9yZWN1cnNpdmUtbGlzdC5yZWN1cnNpdmUgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1saXN0LnJlY3Vyc2l2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E0YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9yZWN1cnNpdmUtbGlzdC5yZWN1cnNpdmUKQEAgLTAsMCArMSwyIEBACit2YWx1ZSA9IFtdCit2YWx1ZS5hcHBlbmQodmFsdWUpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1zZXQucmVjdXJzaXZlIGIvdGVzdHMvZGF0YS9yZWN1cnNpdmUtc2V0LnJlY3Vyc2l2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdjNTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9yZWN1cnNpdmUtc2V0LnJlY3Vyc2l2ZQpAQCAtMCwwICsxLDcgQEAKK3RyeToKKyAgICBzZXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0Cit2YWx1ZSA9IHNldCgpCit2YWx1ZS5hZGQoQW5JbnN0YW5jZShmb289dmFsdWUsIGJhcj12YWx1ZSkpCit2YWx1ZS5hZGQoQW5JbnN0YW5jZShmb289dmFsdWUsIGJhcj12YWx1ZSkpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1zdGF0ZS5yZWN1cnNpdmUgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS1zdGF0ZS5yZWN1cnNpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmZTYxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLXN0YXRlLnJlY3Vyc2l2ZQpAQCAtMCwwICsxLDIgQEAKK3ZhbHVlID0gW10KK3ZhbHVlLmFwcGVuZChBbkluc3RhbmNlV2l0aFN0YXRlKHZhbHVlLCB2YWx1ZSkpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS10dXBsZS5yZWN1cnNpdmUgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS10dXBsZS5yZWN1cnNpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwOGQwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLXR1cGxlLnJlY3Vyc2l2ZQpAQCAtMCwwICsxLDMgQEAKK3ZhbHVlID0gKFtdLCBbXSkKK3ZhbHVlWzBdLmFwcGVuZCh2YWx1ZSkKK3ZhbHVlWzFdLmFwcGVuZCh2YWx1ZVswXSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvcmVjdXJzaXZlLmZvcm1lci1kdW1wZXItZXJyb3IgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS5mb3JtZXItZHVtcGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2NjMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3JlY3Vyc2l2ZS5mb3JtZXItZHVtcGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorZGF0YSA9IFtdCitkYXRhLmFwcGVuZChkYXRhKQorZHVtcChkYXRhKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9yZW1vdmUtcG9zc2libGUtc2ltcGxlLWtleS1idWcubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS9yZW1vdmUtcG9zc2libGUtc2ltcGxlLWtleS1idWcubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWJjNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3JlbW92ZS1wb3NzaWJsZS1zaW1wbGUta2V5LWJ1Zy5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSwzIEBACitmb286ICZBIGJhcgorKkEgXSAgICAjIFRoZSAnXScgaW5kaWNhdG9yIHRyaWdnZXJzIHJlbW92ZV9wb3NzaWJsZV9zaW1wbGVfa2V5LAorICAgICAgICAjIHdoaWNoIHNob3VsZCByYWlzZSBhbiBlcnJvci4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvcmVzb2x2ZXIuZGF0YSBiL3Rlc3RzL2RhdGEvcmVzb2x2ZXIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9yZXNvbHZlci5kYXRhCkBAIC0wLDAgKzEsMzAgQEAKKy0tLQorInRoaXMgc2NhbGFyIHNob3VsZCBiZSBzZWxlY3RlZCIKKy0tLQora2V5MTE6ICFmb28KKyAgICBrZXkxMjoKKyAgICAgICAgaXM6IFtzZWxlY3RlZF0KKyAgICBrZXkyMjoKKyAgICAgICAga2V5MTM6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkyMzogW25vdCwgc2VsZWN0ZWRdCisgICAga2V5MzI6CisgICAgICAgIGtleTMxOiBbbm90LCBzZWxlY3RlZF0KKyAgICAgICAga2V5MzI6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkzMzoge25vdDogc2VsZWN0ZWR9CitrZXkyMTogIWJhcgorICAgIC0gbm90IHNlbGVjdGVkCisgICAgLSBzZWxlY3RlZAorICAgIC0gbm90IHNlbGVjdGVkCitrZXkzMTogIWJhegorICAgIGtleTEyOgorICAgICAgICBrZXkxMzoKKyAgICAgICAgICAgIGtleTE0OiB7c2VsZWN0ZWR9CisgICAgICAgIGtleTIzOgorICAgICAgICAgICAga2V5MTQ6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkzMzoKKyAgICAgICAgICAgIGtleTE0OiB7c2VsZWN0ZWR9CisgICAgICAgICAgICBrZXkyNDoge25vdDogc2VsZWN0ZWR9CisgICAga2V5MjI6CisgICAgICAgIC0gICBrZXkxNDoge3NlbGVjdGVkfQorICAgICAgICAgICAga2V5MjQ6IHtub3Q6IHNlbGVjdGVkfQorICAgICAgICAtICAga2V5MTQ6IHtzZWxlY3RlZH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvcmVzb2x2ZXIucGF0aCBiL3Rlc3RzL2RhdGEvcmVzb2x2ZXIucGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY3N2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9yZXNvbHZlci5wYXRoCkBAIC0wLDAgKzEsMzAgQEAKKy0tLSAhcm9vdC9zY2FsYXIKKyJ0aGlzIHNjYWxhciBzaG91bGQgYmUgc2VsZWN0ZWQiCistLS0gIXJvb3QKK2tleTExOiAhZm9vCisgICAga2V5MTI6ICFyb290L2tleTExL2tleTEyLyoKKyAgICAgICAgaXM6IFtzZWxlY3RlZF0KKyAgICBrZXkyMjoKKyAgICAgICAga2V5MTM6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkyMzogW25vdCwgc2VsZWN0ZWRdCisgICAga2V5MzI6CisgICAgICAgIGtleTMxOiBbbm90LCBzZWxlY3RlZF0KKyAgICAgICAga2V5MzI6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkzMzoge25vdDogc2VsZWN0ZWR9CitrZXkyMTogIWJhcgorICAgIC0gbm90IHNlbGVjdGVkCisgICAgLSAhcm9vdC9rZXkyMS8xLyogc2VsZWN0ZWQKKyAgICAtIG5vdCBzZWxlY3RlZAora2V5MzE6ICFiYXoKKyAgICBrZXkxMjoKKyAgICAgICAga2V5MTM6CisgICAgICAgICAgICBrZXkxNDogIXJvb3Qva2V5MzEvKi8qL2tleTE0L21hcCB7c2VsZWN0ZWR9CisgICAgICAgIGtleTIzOgorICAgICAgICAgICAga2V5MTQ6IFtub3QsIHNlbGVjdGVkXQorICAgICAgICBrZXkzMzoKKyAgICAgICAgICAgIGtleTE0OiAhcm9vdC9rZXkzMS8qLyova2V5MTQvbWFwIHtzZWxlY3RlZH0KKyAgICAgICAgICAgIGtleTI0OiB7bm90OiBzZWxlY3RlZH0KKyAgICBrZXkyMjoKKyAgICAgICAgLSAgIGtleTE0OiAhcm9vdC9rZXkzMS8qLyova2V5MTQvbWFwIHtzZWxlY3RlZH0KKyAgICAgICAgICAgIGtleTI0OiB7bm90OiBzZWxlY3RlZH0KKyAgICAgICAgLSAgIGtleTE0OiAhcm9vdC9rZXkzMS8qLyova2V5MTQvbWFwIHtzZWxlY3RlZH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvcnVuLXBhcnNlci1jcmFzaC1idWcuZGF0YSBiL3Rlc3RzL2RhdGEvcnVuLXBhcnNlci1jcmFzaC1idWcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAxNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9ydW4tcGFyc2VyLWNyYXNoLWJ1Zy5kYXRhCkBAIC0wLDAgKzEsOCBAQAorLS0tCistIEhhcnJ5IFBvdHRlciBhbmQgdGhlIFByaXNvbmVyIG9mIEF6a2FiYW4KKy0gSGFycnkgUG90dGVyIGFuZCB0aGUgR29ibGV0IG9mIEZpcmUKKy0gSGFycnkgUG90dGVyIGFuZCB0aGUgT3JkZXIgb2YgdGhlIFBob2VuaXgKKy0tLQorLSBNZW1vaXJzIEZvdW5kIGluIGEgQmF0aHR1YgorLSBTbm93IENyYXNoCistIEdob3N0IFdvcmxkCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NjYWxhcnMuZXZlbnRzIGIvdGVzdHMvZGF0YS9zY2FsYXJzLmV2ZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmM0MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zY2FsYXJzLmV2ZW50cwpAQCAtMCwwICsxLDI4IEBACistICFTdHJlYW1TdGFydAorCistICFEb2N1bWVudFN0YXJ0CistICFNYXBwaW5nU3RhcnQKKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdlbXB0eSBzY2FsYXInIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSxmYWxzZV0sIHZhbHVlOiAnJyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnaW1wbGljaXQgc2NhbGFyJyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnZGF0YScgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ3F1b3RlZCBzY2FsYXInIH0KKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YScsIHN0eWxlOiAnIicgfQorLSAhU2NhbGFyIHsgaW1wbGljaXQ6IFt0cnVlLHRydWVdLCB2YWx1ZTogJ2Jsb2NrIHNjYWxhcicgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhJywgc3R5bGU6ICd8JyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnZW1wdHkgc2NhbGFyIHdpdGggdGFnJyB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW2ZhbHNlLGZhbHNlXSwgdGFnOiAnIW15dGFnJywgdmFsdWU6ICcnIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdpbXBsaWNpdCBzY2FsYXIgd2l0aCB0YWcnIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbZmFsc2UsZmFsc2VdLCB0YWc6ICchbXl0YWcnLCB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdxdW90ZWQgc2NhbGFyIHdpdGggdGFnJyB9CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEnLCBzdHlsZTogJyInLCB0YWc6ICchbXl0YWcnLCBpbXBsaWNpdDogW2ZhbHNlLGZhbHNlXSB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnYmxvY2sgc2NhbGFyIHdpdGggdGFnJyB9CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEnLCBzdHlsZTogJ3wnLCB0YWc6ICchbXl0YWcnLCBpbXBsaWNpdDogW2ZhbHNlLGZhbHNlXSB9CistICFTY2FsYXIgeyBpbXBsaWNpdDogW3RydWUsdHJ1ZV0sIHZhbHVlOiAnc2luZ2xlIGNoYXJhY3RlcicgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdhJywgaW1wbGljaXQ6IFt0cnVlLHRydWVdIH0KKy0gIVNjYWxhciB7IGltcGxpY2l0OiBbdHJ1ZSx0cnVlXSwgdmFsdWU6ICdzaW5nbGUgZGlnaXQnIH0KKy0gIVNjYWxhciB7IHZhbHVlOiAnMScsIGltcGxpY2l0OiBbdHJ1ZSxmYWxzZV0gfQorLSAhTWFwcGluZ0VuZAorLSAhRG9jdW1lbnRFbmQKKworLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NjYW4tZG9jdW1lbnQtZW5kLWJ1Zy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NjYW4tZG9jdW1lbnQtZW5kLWJ1Zy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwZThhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc2Nhbi1kb2N1bWVudC1lbmQtYnVnLmNhbm9uaWNhbApAQCAtMCwwICsxLDMgQEAKKyVZQU1MIDEuMQorLS0tCishIW51bGwgIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc2Nhbi1kb2N1bWVudC1lbmQtYnVnLmRhdGEgYi90ZXN0cy9kYXRhL3NjYW4tZG9jdW1lbnQtZW5kLWJ1Zy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzA1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NjYW4tZG9jdW1lbnQtZW5kLWJ1Zy5kYXRhCkBAIC0wLDAgKzEsMyBAQAorIyBUaWNrZXQgIzQKKy0tLQorLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zY2FuLWxpbmUtYnJlYWstYnVnLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc2Nhbi1saW5lLWJyZWFrLWJ1Zy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMDhiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc2Nhbi1saW5lLWJyZWFrLWJ1Zy5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeyA/ICEhc3RyICJmb28iIDogISFzdHIgImJhciBiYXoiIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc2Nhbi1saW5lLWJyZWFrLWJ1Zy5kYXRhIGIvdGVzdHMvZGF0YS9zY2FuLWxpbmUtYnJlYWstYnVnLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NGZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc2Nhbi1saW5lLWJyZWFrLWJ1Zy5kYXRhCkBAIC0wLDAgKzEsMyBAQAorZm9vOg0KKyAgICBiYXINCisgICAgYmF6DQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zZXF1ZW5jZXMuZXZlbnRzIGIvdGVzdHMvZGF0YS9zZXF1ZW5jZXMuZXZlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MmEzMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NlcXVlbmNlcy5ldmVudHMKQEAgLTAsMCArMSw4MSBAQAorLSAhU3RyZWFtU3RhcnQKKworLSAhRG9jdW1lbnRTdGFydAorLSAhU2VxdWVuY2VTdGFydAorLSAhU2VxdWVuY2VFbmQKKy0gIURvY3VtZW50RW5kCisKKy0gIURvY3VtZW50U3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQgeyB0YWc6ICchbXl0YWcnLCBpbXBsaWNpdDogZmFsc2UgfQorLSAhU2VxdWVuY2VFbmQKKy0gIURvY3VtZW50RW5kCisKKy0gIURvY3VtZW50U3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZVN0YXJ0IHsgdGFnOiAnIW15dGFnJywgaW1wbGljaXQ6IGZhbHNlIH0KKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZVN0YXJ0CistICFTY2FsYXIKKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YScgfQorLSAhU2NhbGFyIHsgdGFnOiAnIW15dGFnJywgaW1wbGljaXQ6IFtmYWxzZSxmYWxzZV0sIHZhbHVlOiAnZGF0YScgfQorLSAhU2VxdWVuY2VFbmQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNjYWxhcgorLSAhU2VxdWVuY2VFbmQKKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZUVuZAorLSAhU2VxdWVuY2VTdGFydAorLSAhU2VxdWVuY2VTdGFydCB7IHRhZzogJyFteXRhZycsIGltcGxpY2l0OiBmYWxzZSB9CistICFTZXF1ZW5jZVN0YXJ0CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZUVuZAorLSAhU2VxdWVuY2VFbmQKKy0gIVNlcXVlbmNlRW5kCistICFEb2N1bWVudEVuZAorCistICFEb2N1bWVudFN0YXJ0CistICFTZXF1ZW5jZVN0YXJ0CistICFNYXBwaW5nU3RhcnQKKy0gIVNjYWxhciB7IHZhbHVlOiAna2V5MScgfQorLSAhU2VxdWVuY2VTdGFydAorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhMScgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhMicgfQorLSAhU2VxdWVuY2VFbmQKKy0gIVNjYWxhciB7IHZhbHVlOiAna2V5MicgfQorLSAhU2VxdWVuY2VTdGFydCB7IHRhZzogJyFteXRhZzEnLCBpbXBsaWNpdDogZmFsc2UgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhMycgfQorLSAhU2VxdWVuY2VTdGFydAorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhNCcgfQorLSAhU2NhbGFyIHsgdmFsdWU6ICdkYXRhNScgfQorLSAhU2VxdWVuY2VFbmQKKy0gIVNlcXVlbmNlU3RhcnQgeyB0YWc6ICchbXl0YWcyJywgaW1wbGljaXQ6IGZhbHNlIH0KKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YTYnIH0KKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YTcnIH0KKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZUVuZAorLSAhTWFwcGluZ0VuZAorLSAhU2VxdWVuY2VFbmQKKy0gIURvY3VtZW50RW5kCisKKy0gIURvY3VtZW50U3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlU3RhcnQgeyBmbG93X3N0eWxlOiB0cnVlIH0KKy0gIVNlcXVlbmNlU3RhcnQKKy0gIVNlcXVlbmNlRW5kCistICFTY2FsYXIKKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YScgfQorLSAhU2NhbGFyIHsgdGFnOiAnIW15dGFnJywgaW1wbGljaXQ6IFtmYWxzZSxmYWxzZV0sIHZhbHVlOiAnZGF0YScgfQorLSAhU2VxdWVuY2VTdGFydCB7IHRhZzogJyFteXRhZycsIGltcGxpY2l0OiBmYWxzZSB9CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNjYWxhciB7IHZhbHVlOiAnZGF0YScgfQorLSAhU2VxdWVuY2VFbmQKKy0gIVNlcXVlbmNlRW5kCistICFTZXF1ZW5jZUVuZAorLSAhRG9jdW1lbnRFbmQKKworLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NlcmlhbGl6ZXItaXMtYWxyZWFkeS1vcGVuZWQuZHVtcGVyLWVycm9yIGIvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLWFscmVhZHktb3BlbmVkLmR1bXBlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIzNTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLWFscmVhZHktb3BlbmVkLmR1bXBlci1lcnJvcgpAQCAtMCwwICsxLDMgQEAKK2R1bXBlciA9IHlhbWwuRHVtcGVyKFN0cmluZ0lPKCkpCitkdW1wZXIub3BlbigpCitkdW1wZXIub3BlbigpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NlcmlhbGl6ZXItaXMtY2xvc2VkLTEuZHVtcGVyLWVycm9yIGIvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLWNsb3NlZC0xLmR1bXBlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTdlNjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLWNsb3NlZC0xLmR1bXBlci1lcnJvcgpAQCAtMCwwICsxLDQgQEAKK2R1bXBlciA9IHlhbWwuRHVtcGVyKFN0cmluZ0lPKCkpCitkdW1wZXIub3BlbigpCitkdW1wZXIuY2xvc2UoKQorZHVtcGVyLm9wZW4oKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLWNsb3NlZC0yLmR1bXBlci1lcnJvciBiL3Rlc3RzL2RhdGEvc2VyaWFsaXplci1pcy1jbG9zZWQtMi5kdW1wZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZWY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc2VyaWFsaXplci1pcy1jbG9zZWQtMi5kdW1wZXItZXJyb3IKQEAgLTAsMCArMSw0IEBACitkdW1wZXIgPSB5YW1sLkR1bXBlcihTdHJpbmdJTygpKQorZHVtcGVyLm9wZW4oKQorZHVtcGVyLmNsb3NlKCkKK2R1bXBlci5zZXJpYWxpemUoeWFtbC5TY2FsYXJOb2RlKHRhZz0nIWZvbycsIHZhbHVlPSdiYXInKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc2VyaWFsaXplci1pcy1ub3Qtb3BlbmVkLTEuZHVtcGVyLWVycm9yIGIvdGVzdHMvZGF0YS9zZXJpYWxpemVyLWlzLW5vdC1vcGVuZWQtMS5kdW1wZXItZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyMmU3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc2VyaWFsaXplci1pcy1ub3Qtb3BlbmVkLTEuZHVtcGVyLWVycm9yCkBAIC0wLDAgKzEsMiBAQAorZHVtcGVyID0geWFtbC5EdW1wZXIoU3RyaW5nSU8oKSkKK2R1bXBlci5jbG9zZSgpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NlcmlhbGl6ZXItaXMtbm90LW9wZW5lZC0yLmR1bXBlci1lcnJvciBiL3Rlc3RzL2RhdGEvc2VyaWFsaXplci1pcy1ub3Qtb3BlbmVkLTIuZHVtcGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDlkZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NlcmlhbGl6ZXItaXMtbm90LW9wZW5lZC0yLmR1bXBlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKK2R1bXBlciA9IHlhbWwuRHVtcGVyKFN0cmluZ0lPKCkpCitkdW1wZXIuc2VyaWFsaXplKHlhbWwuU2NhbGFyTm9kZSh0YWc9JyFmb28nLCB2YWx1ZT0nYmFyJykpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NpbmdsZS1kb3QtaXMtbm90LWZsb2F0LWJ1Zy5jb2RlIGIvdGVzdHMvZGF0YS9zaW5nbGUtZG90LWlzLW5vdC1mbG9hdC1idWcuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QwYzJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zaW5nbGUtZG90LWlzLW5vdC1mbG9hdC1idWcuY29kZQpAQCAtMCwwICsxIEBACisnLicKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc2luZ2xlLWRvdC1pcy1ub3QtZmxvYXQtYnVnLmRhdGEgYi90ZXN0cy9kYXRhL3NpbmdsZS1kb3QtaXMtbm90LWZsb2F0LWJ1Zy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTU4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NpbmdsZS1kb3QtaXMtbm90LWZsb2F0LWJ1Zy5kYXRhCkBAIC0wLDAgKzEgQEAKKy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc2xvcHB5LWluZGVudGF0aW9uLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc2xvcHB5LWluZGVudGF0aW9uLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zbG9wcHktaW5kZW50YXRpb24uY2Fub25pY2FsCkBAIC0wLDAgKzEsMTggQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7IAorICAgID8gISFzdHIgImluIHRoZSBibG9jayBjb250ZXh0IgorICAgIDogISFtYXAgeworICAgICAgICA/ICEhc3RyICJpbmRlbnRhdGlvbiBzaG91bGQgYmUga2VwdCIKKyAgICAgICAgOiAhIW1hcCB7CisgICAgICAgICAgICA/ICEhc3RyICJidXQgaW4gdGhlIGZsb3cgY29udGV4dCIKKyAgICAgICAgICAgIDogISFzZXEgWyAhIXN0ciAiaXQgbWF5IGJlIHZpb2xhdGVkIiBdCisgICAgICAgIH0KKyAgICB9Cit9CistLS0gISFzdHIKKyJ0aGUgcGFyc2VyIGRvZXMgbm90IHJlcXVpcmUgc2NhbGFycyB0byBiZSBpbmRlbnRlZCB3aXRoIGF0IGxlYXN0IG9uZSBzcGFjZSIKKy0tLSAhIXN0cgorInRoZSBwYXJzZXIgZG9lcyBub3QgcmVxdWlyZSBzY2FsYXJzIHRvIGJlIGluZGVudGVkIHdpdGggYXQgbGVhc3Qgb25lIHNwYWNlIgorLS0tICEhbWFwCit7ID8gISFzdHIgImZvbyI6IHsgPyAhIXN0ciAiYmFyIiA6ICEhc3RyICJxdW90ZWQgc2NhbGFycyBtYXkgbm90IGFkaGVyZSBpbmRlbnRhdGlvbiIgfSB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3Nsb3BweS1pbmRlbnRhdGlvbi5kYXRhIGIvdGVzdHMvZGF0YS9zbG9wcHktaW5kZW50YXRpb24uZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI0ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zbG9wcHktaW5kZW50YXRpb24uZGF0YQpAQCAtMCwwICsxLDE3IEBACistLS0KK2luIHRoZSBibG9jayBjb250ZXh0OgorICAgIGluZGVudGF0aW9uIHNob3VsZCBiZSBrZXB0OiB7IAorICAgIGJ1dCBpbiB0aGUgZmxvdyBjb250ZXh0OiBbCitpdCBtYXkgYmUgdmlvbGF0ZWRdCit9CistLS0KK3RoZSBwYXJzZXIgZG9lcyBub3QgcmVxdWlyZSBzY2FsYXJzCit0byBiZSBpbmRlbnRlZCB3aXRoIGF0IGxlYXN0IG9uZSBzcGFjZQorLi4uCistLS0KKyJ0aGUgcGFyc2VyIGRvZXMgbm90IHJlcXVpcmUgc2NhbGFycwordG8gYmUgaW5kZW50ZWQgd2l0aCBhdCBsZWFzdCBvbmUgc3BhY2UiCistLS0KK2ZvbzoKKyAgICBiYXI6ICdxdW90ZWQgc2NhbGFycworbWF5IG5vdCBhZGhlcmUgaW5kZW50YXRpb24nCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmU2NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDEuZGF0YQpAQCAtMCwwICsxLDMgQEAKKy0gTWFyayBNY0d3aXJlCistIFNhbW15IFNvc2EKKy0gS2VuIEdyaWZmZXkKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMS5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDEuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzJmNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDEuc3RydWN0dXJlCkBAIC0wLDAgKzEgQEAKK1tUcnVlLCBUcnVlLCBUcnVlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTAxLnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0NGNhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMS50b2tlbnMKQEAgLTAsMCArMSBAQAorW1sgLCBfICwgXyAsIF8gXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTAyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3ZWM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMi5kYXRhCkBAIC0wLDAgKzEsMyBAQAoraHI6ICA2NSAgICAjIEhvbWUgcnVucworYXZnOiAwLjI3OCAjIEJhdHRpbmcgYXZlcmFnZQorcmJpOiAxNDcgICAjIFJ1bnMgQmF0dGVkIEluCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDIuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTAyLnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmExY2VkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTAyLnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMi50b2tlbnMgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDIudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTM4MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDIudG9rZW5zCkBAIC0wLDAgKzEsNSBAQAore3sKKz8gXyA6IF8KKz8gXyA6IF8KKz8gXyA6IF8KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmQ2MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDMuZGF0YQpAQCAtMCwwICsxLDggQEAKK2FtZXJpY2FuOgorICAtIEJvc3RvbiBSZWQgU294CisgIC0gRGV0cm9pdCBUaWdlcnMKKyAgLSBOZXcgWW9yayBZYW5rZWVzCituYXRpb25hbDoKKyAgLSBOZXcgWW9yayBNZXRzCisgIC0gQ2hpY2FnbyBDdWJzCisgIC0gQXRsYW50YSBCcmF2ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wMy5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDMuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGU1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDMuc3RydWN0dXJlCkBAIC0wLDAgKzEgQEAKK1soVHJ1ZSwgW1RydWUsIFRydWUsIFRydWVdKSwgKFRydWUsIFtUcnVlLCBUcnVlLCBUcnVlXSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDMudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTAzLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgxNWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTAzLnRva2VucwpAQCAtMCwwICsxLDQgQEAKK3t7Cis/IF8gOiBbWyAsIF8gLCBfICwgXyBdfQorPyBfIDogW1sgLCBfICwgXyAsIF8gXX0KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDQuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGY2YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDQuZGF0YQpAQCAtMCwwICsxLDggQEAKKy0KKyAgbmFtZTogTWFyayBNY0d3aXJlCisgIGhyOiAgIDY1CisgIGF2ZzogIDAuMjc4CistCisgIG5hbWU6IFNhbW15IFNvc2EKKyAgaHI6ICAgNjMKKyAgYXZnOiAgMC4yODgKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNC5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDQuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDQuc3RydWN0dXJlCkBAIC0wLDAgKzEsNCBAQAorWworICAgIFsoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKKyAgICBbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0sCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDQudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA0LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2I5ODE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA0LnRva2VucwpAQCAtMCwwICsxLDQgQEAKK1tbCissIHt7ID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfIF19CissIHt7ID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfIF19CitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTA1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ3NzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA1LmRhdGEKQEAgLTAsMCArMSwzIEBACistIFtuYW1lICAgICAgICAsIGhyLCBhdmcgIF0KKy0gW01hcmsgTWNHd2lyZSwgNjUsIDAuMjc4XQorLSBbU2FtbXkgU29zYSAgLCA2MywgMC4yODhdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDUuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA1LnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDZiNzVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA1LnN0cnVjdHVyZQpAQCAtMCwwICsxLDUgQEAKK1sKKyAgICBbVHJ1ZSwgVHJ1ZSwgVHJ1ZV0sCisgICAgW1RydWUsIFRydWUsIFRydWVdLAorICAgIFtUcnVlLCBUcnVlLCBUcnVlXSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNS50b2tlbnMgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDUudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmYxYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDUudG9rZW5zCkBAIC0wLDAgKzEsNSBAQAorW1sKKywgWyBfICwgXyAsIF8gXQorLCBbIF8gLCBfICwgXyBdCissIFsgXyAsIF8gLCBfIF0KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDYuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTU3YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDYuZGF0YQpAQCAtMCwwICsxLDUgQEAKK01hcmsgTWNHd2lyZToge2hyOiA2NSwgYXZnOiAwLjI3OH0KK1NhbW15IFNvc2E6IHsKKyAgICBocjogNjMsCisgICAgYXZnOiAwLjI4OAorICB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDYuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA2LnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWYwZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA2LnN0cnVjdHVyZQpAQCAtMCwwICsxLDQgQEAKK1sKKyAgICAoVHJ1ZSwgWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSksCisgICAgKFRydWUsIFsoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0pLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTA2LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNi50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNWVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNi50b2tlbnMKQEAgLTAsMCArMSw0IEBACit7eworPyBfIDogeyA/IF8gOiBfICwgPyBfIDogXyB9Cis/IF8gOiB7ID8gXyA6IF8gLCA/IF8gOiBfIH0KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDcuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzExZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDcuZGF0YQpAQCAtMCwwICsxLDEwIEBACisjIFJhbmtpbmcgb2YgMTk5OCBob21lIHJ1bnMKKy0tLQorLSBNYXJrIE1jR3dpcmUKKy0gU2FtbXkgU29zYQorLSBLZW4gR3JpZmZleQorCisjIFRlYW0gcmFua2luZworLS0tCistIENoaWNhZ28gQ3VicworLSBTdCBMb3VpcyBDYXJkaW5hbHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNy5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDcuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDcyYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDcuc3RydWN0dXJlCkBAIC0wLDAgKzEsNCBAQAorWworW1RydWUsIFRydWUsIFRydWVdLAorW1RydWUsIFRydWVdLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTA3LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNy50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ODg4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wNy50b2tlbnMKQEAgLTAsMCArMSwxMiBAQAorLS0tCitbWworLCBfCissIF8KKywgXworXX0KKworLS0tCitbWworLCBfCissIF8KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDguZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wOC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDguZGF0YQpAQCAtMCwwICsxLDEwIEBACistLS0KK3RpbWU6IDIwOjAzOjIwCitwbGF5ZXI6IFNhbW15IFNvc2EKK2FjdGlvbjogc3RyaWtlIChtaXNzKQorLi4uCistLS0KK3RpbWU6IDIwOjAzOjQ3CitwbGF5ZXI6IFNhbW15IFNvc2EKK2FjdGlvbjogZ3JhbmQgc2xhbQorLi4uCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDguc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA4LnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNmZjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA4LnN0cnVjdHVyZQpAQCAtMCwwICsxLDQgQEAKK1sKK1soVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKK1soVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0wOC50b2tlbnMgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDgudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmMwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDgudG9rZW5zCkBAIC0wLDAgKzEsMTUgQEAKKy0tLQore3sKKz8gXyA6IF8KKz8gXyA6IF8KKz8gXyA6IF8KK119CisuLi4KKworLS0tCit7eworPyBfIDogXworPyBfIDogXworPyBfIDogXworXX0KKy4uLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTA5LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMDkuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjY0MTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA5LmRhdGEKQEAgLTAsMCArMSw4IEBACistLS0KK2hyOiAjIDE5OTggaHIgcmFua2luZworICAtIE1hcmsgTWNHd2lyZQorICAtIFNhbW15IFNvc2EKK3JiaToKKyAgIyAxOTk4IHJiaSByYW5raW5nCisgIC0gU2FtbXkgU29zYQorICAtIEtlbiBHcmlmZmV5CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMDkuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA5LnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGM5OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTA5LnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitbKFRydWUsIFtUcnVlLCBUcnVlXSksIChUcnVlLCBbVHJ1ZSwgVHJ1ZV0pXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTA5LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wOS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYzEwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0wOS50b2tlbnMKQEAgLTAsMCArMSw1IEBACistLS0KK3t7Cis/IF8gOiBbWyAsIF8gLCBfIF19Cis/IF8gOiBbWyAsIF8gLCBfIF19CitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTAuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgwOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLmRhdGEKQEAgLTAsMCArMSw4IEBACistLS0KK2hyOgorICAtIE1hcmsgTWNHd2lyZQorICAjIEZvbGxvd2luZyBub2RlIGxhYmVsZWQgU1MKKyAgLSAmU1MgU2FtbXkgU29zYQorcmJpOgorICAtICpTUyAjIFN1YnNlcXVlbnQgb2NjdXJyZW5jZQorICAtIEtlbiBHcmlmZmV5CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTAuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhmNGMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitbKFRydWUsIFtUcnVlLCBUcnVlXSksIChUcnVlLCBbJyonLCBUcnVlXSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTAudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNhYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEwLnRva2VucwpAQCAtMCwwICsxLDUgQEAKKy0tLQore3sKKz8gXyA6IFtbICwgXyAsICYgXyBdfQorPyBfIDogW1sgLCAqICwgXyBdfQorXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTExLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyM2NlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMS5kYXRhCkBAIC0wLDAgKzEsOSBAQAorPyAtIERldHJvaXQgVGlnZXJzCisgIC0gQ2hpY2FnbyBjdWJzCis6CisgIC0gMjAwMS0wNy0yMworCis/IFsgTmV3IFlvcmsgWWFua2VlcywKKyAgICBBdGxhbnRhIEJyYXZlcyBdCis6IFsgMjAwMS0wNy0wMiwgMjAwMS0wOC0xMiwKKyAgICAyMDAxLTA4LTE0IF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMS5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTEuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGYxZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTEuc3RydWN0dXJlCkBAIC0wLDAgKzEsNCBAQAorWworKFtUcnVlLCBUcnVlXSwgW1RydWVdKSwKKyhbVHJ1ZSwgVHJ1ZV0sIFtUcnVlLCBUcnVlLCBUcnVlXSksCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTEudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTExLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI0MjAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTExLnRva2VucwpAQCAtMCwwICsxLDYgQEAKK3t7Cis/IFtbICwgXyAsIF8gXX0KKzogW1sgLCBfIF19Cis/IFsgXyAsIF8gXQorOiBbIF8gLCBfICwgXyBdCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTEyLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmMzM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEyLmRhdGEKQEAgLTAsMCArMSw4IEBACistLS0KKyMgcHJvZHVjdHMgcHVyY2hhc2VkCistIGl0ZW0gICAgOiBTdXBlciBIb29wCisgIHF1YW50aXR5OiAxCistIGl0ZW0gICAgOiBCYXNrZXRiYWxsCisgIHF1YW50aXR5OiA0CistIGl0ZW0gICAgOiBCaWcgU2hvZXMKKyAgcXVhbnRpdHk6IDEKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMi5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTIuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzUzNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTIuc3RydWN0dXJlCkBAIC0wLDAgKzEsNSBAQAorWworWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKK1soVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0sCitbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTEyLnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMi50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMWU1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xMi50b2tlbnMKQEAgLTAsMCArMSw2IEBACistLS0KK1tbCissIHt7ID8gXyA6IF8gPyBfIDogXyBdfQorLCB7eyA/IF8gOiBfID8gXyA6IF8gXX0KKywge3sgPyBfIDogXyA/IF8gOiBfIF19CitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZiNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLmRhdGEKQEAgLTAsMCArMSw0IEBACisjIEFTQ0lJIEFydAorLS0tIHwKKyAgXC8vfHxcL3x8CisgIC8vIHx8ICB8fF9fCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTMuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E5NTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitUcnVlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTMudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU2YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTEzLnRva2VucwpAQCAtMCwwICsxIEBACistLS0gXwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTk0M2RlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE0LmRhdGEKQEAgLTAsMCArMSw0IEBACistLS0KKyAgTWFyayBNY0d3aXJlJ3MKKyAgeWVhciB3YXMgY3JpcHBsZWQKKyAgYnkgYSBrbmVlIGluanVyeS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNC5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTQuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTk1MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTQuc3RydWN0dXJlCkBAIC0wLDAgKzEgQEAKK1RydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNC50b2tlbnMgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTQudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTZjMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTQudG9rZW5zCkBAIC0wLDAgKzEgQEAKKy0tLSBfCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjg5YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTUuZGF0YQpAQCAtMCwwICsxLDggQEAKKz4KKyBTYW1teSBTb3NhIGNvbXBsZXRlZCBhbm90aGVyCisgZmluZSBzZWFzb24gd2l0aCBncmVhdCBzdGF0cy4KKworICAgNjMgSG9tZSBSdW5zCisgICAwLjI4OCBCYXR0aW5nIEF2ZXJhZ2UKKworIFdoYXQgYSB5ZWFyIQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE1LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNS5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhOTUxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNS5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorVHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE1LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzNTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNS50b2tlbnMKQEAgLTAsMCArMSBAQAorXwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE2LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTYuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY2ZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE2LmRhdGEKQEAgLTAsMCArMSw3IEBACituYW1lOiBNYXJrIE1jR3dpcmUKK2FjY29tcGxpc2htZW50OiA+CisgIE1hcmsgc2V0IGEgbWFqb3IgbGVhZ3VlCisgIGhvbWUgcnVuIHJlY29yZCBpbiAxOTk4Lgorc3RhdHM6IHwKKyAgNjUgSG9tZSBSdW5zCisgIDAuMjc4IEJhdHRpbmcgQXZlcmFnZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE2LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNi5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhMWNlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNi5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTYudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE2LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGUzODFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE2LnRva2VucwpAQCAtMCwwICsxLDUgQEAKK3t7Cis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE3LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg3MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE3LmRhdGEKQEAgLTAsMCArMSw3IEBACit1bmljb2RlOiAiU29zYSBkaWQgZmluZS5cdTI2M0EiCitjb250cm9sOiAiXGIxOTk4XHQxOTk5XHQyMDAwXG4iCitoZXhlc2M6ICAiXHgxM1x4MTAgaXMgXHJcbiIKKworc2luZ2xlOiAnIkhvd2R5ISIgaGUgY3JpZWQuJworcXVvdGVkOiAnICMgbm90IGEgJydjb21tZW50JycuJwordGllLWZpZ2h0ZXI6ICd8XC0qLS98JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE3LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNy5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNjQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xNy5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTcudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE3LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY1NTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE3LnRva2VucwpAQCAtMCwwICsxLDggQEAKK3t7Cis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE4YmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LmRhdGEKQEAgLTAsMCArMSw2IEBACitwbGFpbjoKKyAgVGhpcyB1bnF1b3RlZCBzY2FsYXIKKyAgc3BhbnMgbWFueSBsaW5lcy4KKworcXVvdGVkOiAiU28gZG9lcyB0aGlzCisgIHF1b3RlZCBzY2FsYXIuXG4iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTguc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0OTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMTgudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IzMWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE4LnRva2VucwpAQCAtMCwwICsxLDQgQEAKK3t7Cis/IF8gOiBfCis/IF8gOiBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE5LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMTkuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY5ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTE5LmRhdGEKQEAgLTAsMCArMSw1IEBACitjYW5vbmljYWw6IDEyMzQ1CitkZWNpbWFsOiArMTIsMzQ1CitzZXhhZ2VzaW1hbDogMzoyNTo0NQorb2N0YWw6IDAxNAoraGV4YWRlY2ltYWw6IDB4QwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE5LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xOS5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xOS5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTE5LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xOS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkYTY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0xOS50b2tlbnMKQEAgLTAsMCArMSw3IEBACit7eworPyBfIDogXworPyBfIDogXworPyBfIDogXworPyBfIDogXworPyBfIDogXworXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ODk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMC5kYXRhCkBAIC0wLDAgKzEsNiBAQAorY2Fub25pY2FsOiAxLjIzMDE1ZSszCitleHBvbmVudGlhbDogMTIuMzAxNWUrMDIKK3NleGFnZXNpbWFsOiAyMDozMC4xNQorZml4ZWQ6IDEsMjMwLjE1CituZWdhdGl2ZSBpbmZpbml0eTogLS5pbmYKK25vdCBhIG51bWJlcjogLk5hTgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTIwLnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMC5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNjQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMC5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjAudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIwLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY1NTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIwLnRva2VucwpAQCAtMCwwICsxLDggQEAKK3t7Cis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTIxLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM2YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIxLmRhdGEKQEAgLTAsMCArMSw0IEBACitudWxsOiB+Cit0cnVlOiB5CitmYWxzZTogbgorc3RyaW5nOiAnMTIzNDUnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjEuc3RydWN0dXJlIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIxLnN0cnVjdHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjE2MzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIxLnN0cnVjdHVyZQpAQCAtMCwwICsxIEBACitbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTIxLnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjY2JhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMS50b2tlbnMKQEAgLTAsMCArMSw2IEBACit7eworPyBfIDogXworPyBfIDogXworPyBfIDogXworPyBfIDogXworXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhYzE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMi5kYXRhCkBAIC0wLDAgKzEsNCBAQAorY2Fub25pY2FsOiAyMDAxLTEyLTE1VDAyOjU5OjQzLjFaCitpc284NjAxOiAyMDAxLTEyLTE0dDIxOjU5OjQzLjEwLTA1OjAwCitzcGFjZWQ6IDIwMDEtMTItMTQgMjE6NTk6NDMuMTAgLTUKK2RhdGU6IDIwMDItMTItMTQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMi5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjIuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjIuc3RydWN0dXJlCkBAIC0wLDAgKzEgQEAKK1soVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjIudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIyLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNjYmFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIyLnRva2VucwpAQCAtMCwwICsxLDYgQEAKK3t7Cis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTIzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGJkOTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTIzLmRhdGEKQEAgLTAsMCArMSwxMyBAQAorLS0tCitub3QtZGF0ZTogISFzdHIgMjAwMi0wNC0yOAorCitwaWN0dXJlOiAhIWJpbmFyeSB8CisgUjBsR09EbGhEQUFNQUlRQUFQLy85L1gKKyAxN3VucDVXWm1aZ0FBQU9mbjUxNWVYdgorIFB6N1k2T2p1RGc0SitmbjVPVGs2ZW5wCisgNTZlbm1sZUVDY2dnZ29CQURzPQorCithcHBsaWNhdGlvbiBzcGVjaWZpYyB0YWc6ICFzb21ldGhpbmcgfAorIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIHRhZworIGFib3ZlIG1heSBiZSBkaWZmZXJlbnQgZm9yCisgZGlmZmVyZW50IGRvY3VtZW50cy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMy5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjMuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTFjZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjMuc3RydWN0dXJlCkBAIC0wLDAgKzEgQEAKK1soVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTIzLnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMy50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjNTRhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yMy50b2tlbnMKQEAgLTAsMCArMSw2IEBACistLS0KK3t7Cis/IF8gOiAhIF8KKz8gXyA6ICEgXworPyBfIDogISBfCitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTgwNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI0LmRhdGEKQEAgLTAsMCArMSwxNCBAQAorJVRBRyAhIHRhZzpjbGFya2V2YW5zLmNvbSwyMDAyOgorLS0tICFzaGFwZQorICAjIFVzZSB0aGUgISBoYW5kbGUgZm9yIHByZXNlbnRpbmcKKyAgIyB0YWc6Y2xhcmtldmFucy5jb20sMjAwMjpjaXJjbGUKKy0gIWNpcmNsZQorICBjZW50ZXI6ICZPUklHSU4ge3g6IDczLCB5OiAxMjl9CisgIHJhZGl1czogNworLSAhbGluZQorICBzdGFydDogKk9SSUdJTgorICBmaW5pc2g6IHsgeDogODksIHk6IDEwMiB9CistICFsYWJlbAorICBzdGFydDogKk9SSUdJTgorICBjb2xvcjogMHhGRkVFQkIKKyAgdGV4dDogUHJldHR5IHZlY3RvciBkcmF3aW5nLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI0LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNC5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMDcyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNC5zdHJ1Y3R1cmUKQEAgLTAsMCArMSw1IEBACitbCitbKFRydWUsIFsoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0pLCAoVHJ1ZSwgVHJ1ZSldLAorWyhUcnVlLCAnKicpLCAoVHJ1ZSwgWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSldLAorWyhUcnVlLCAnKicpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0sCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjQudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI0LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzljMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI0LnRva2VucwpAQCAtMCwwICsxLDIwIEBACislCistLS0gIQorW1sKKywgIQorICAgIHt7CisgICAgPyBfIDogJiB7ID8gXyA6IF8gLCA/IF8gOiBfIH0KKyAgICA/IF8gOiBfCisgICAgXX0KKywgIQorICAgIHt7CisgICAgPyBfIDogKgorICAgID8gXyA6IHsgPyBfIDogXyAsID8gXyA6IF8gfQorICAgIF19CissICEKKyAgICB7eworICAgID8gXyA6ICoKKyAgICA/IF8gOiBfCisgICAgPyBfIDogXworICAgIF19CitdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjlhYzMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI1LmRhdGEKQEAgLTAsMCArMSw3IEBACisjIHNldHMgYXJlIHJlcHJlc2VudGVkIGFzIGEKKyMgbWFwcGluZyB3aGVyZSBlYWNoIGtleSBpcworIyBhc3NvY2lhdGVkIHdpdGggdGhlIGVtcHR5IHN0cmluZworLS0tICEhc2V0Cis/IE1hcmsgTWNHd2lyZQorPyBTYW1teSBTb3NhCis/IEtlbiBHcmlmZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI1LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNS5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0MGU2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNS5zdHJ1Y3R1cmUKQEAgLTAsMCArMSBAQAorWyhUcnVlLCBOb25lKSwgKFRydWUsIE5vbmUpLCAoVHJ1ZSwgTm9uZSldCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjUudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI1LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAwMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI1LnRva2VucwpAQCAtMCwwICsxLDYgQEAKKy0tLSAhCit7eworPyBfCis/IF8KKz8gXworXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI2LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0Mzc2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNi5kYXRhCkBAIC0wLDAgKzEsNyBAQAorIyBvcmRlcmVkIG1hcHMgYXJlIHJlcHJlc2VudGVkIGFzCisjIGEgc2VxdWVuY2Ugb2YgbWFwcGluZ3MsIHdpdGgKKyMgZWFjaCBtYXBwaW5nIGhhdmluZyBvbmUga2V5CistLS0gISFvbWFwCistIE1hcmsgTWNHd2lyZTogNjUKKy0gU2FtbXkgU29zYTogNjMKKy0gS2VuIEdyaWZmeTogNTgKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNi5zdHJ1Y3R1cmUgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjYuc3RydWN0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDI5YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjYuc3RydWN0dXJlCkBAIC0wLDAgKzEsNSBAQAorWworWyhUcnVlLCBUcnVlKV0sCitbKFRydWUsIFRydWUpXSwKK1soVHJ1ZSwgVHJ1ZSldLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI2LnRva2VucyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNi50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlZTQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNi50b2tlbnMKQEAgLTAsMCArMSw2IEBACistLS0gIQorW1sKKywge3sgPyBfIDogXyBdfQorLCB7eyA/IF8gOiBfIF19CissIHt7ID8gXyA6IF8gXX0KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjcuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjU3MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjcuZGF0YQpAQCAtMCwwICsxLDI5IEBACistLS0gITx0YWc6Y2xhcmtldmFucy5jb20sMjAwMjppbnZvaWNlPgoraW52b2ljZTogMzQ4NDMKK2RhdGUgICA6IDIwMDEtMDEtMjMKK2JpbGwtdG86ICZpZDAwMQorICAgIGdpdmVuICA6IENocmlzCisgICAgZmFtaWx5IDogRHVtYXJzCisgICAgYWRkcmVzczoKKyAgICAgICAgbGluZXM6IHwKKyAgICAgICAgICAgIDQ1OCBXYWxrbWFuIERyLgorICAgICAgICAgICAgU3VpdGUgIzI5MgorICAgICAgICBjaXR5ICAgIDogUm95YWwgT2FrCisgICAgICAgIHN0YXRlICAgOiBNSQorICAgICAgICBwb3N0YWwgIDogNDgwNDYKK3NoaXAtdG86ICppZDAwMQorcHJvZHVjdDoKKyAgICAtIHNrdSAgICAgICAgIDogQkwzOTRECisgICAgICBxdWFudGl0eSAgICA6IDQKKyAgICAgIGRlc2NyaXB0aW9uIDogQmFza2V0YmFsbAorICAgICAgcHJpY2UgICAgICAgOiA0NTAuMDAKKyAgICAtIHNrdSAgICAgICAgIDogQkw0NDM4SAorICAgICAgcXVhbnRpdHkgICAgOiAxCisgICAgICBkZXNjcmlwdGlvbiA6IFN1cGVyIEhvb3AKKyAgICAgIHByaWNlICAgICAgIDogMjM5Mi4wMAordGF4ICA6IDI1MS40MgordG90YWw6IDQ0NDMuNTIKK2NvbW1lbnRzOgorICAgIExhdGUgYWZ0ZXJub29uIGlzIGJlc3QuCisgICAgQmFja3VwIGNvbnRhY3QgaXMgTmFuY3kKKyAgICBCaWxsc21lciBAIDMzOC00MzM4LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI3LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNy5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxMTNiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNy5zdHJ1Y3R1cmUKQEAgLTAsMCArMSwxNyBAQAorWworKFRydWUsIFRydWUpLAorKFRydWUsIFRydWUpLAorKFRydWUsIFsKKyAgICAoVHJ1ZSwgVHJ1ZSksCisgICAgKFRydWUsIFRydWUpLAorICAgIChUcnVlLCBbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSksCisgICAgXSksCisoVHJ1ZSwgJyonKSwKKyhUcnVlLCBbCisgICAgICAgIFsoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldLAorICAgICAgICBbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKKyAgICBdKSwKKyhUcnVlLCBUcnVlKSwKKyhUcnVlLCBUcnVlKSwKKyhUcnVlLCBUcnVlKSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yNy50b2tlbnMgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjcudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzFjMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDItMjcudG9rZW5zCkBAIC0wLDAgKzEsMjAgQEAKKy0tLSAhCit7eworPyBfIDogXworPyBfIDogXworPyBfIDogJgorICAgIHt7CisgICAgPyBfIDogXworICAgID8gXyA6IF8KKyAgICA/IF8gOiB7eyA/IF8gOiBfID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfIF19CisgICAgXX0KKz8gXyA6ICoKKz8gXyA6CisgICAgW1sKKyAgICAsIHt7ID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfID8gXyA6IF8gXX0KKyAgICAsIHt7ID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfID8gXyA6IF8gXX0KKyAgICBdfQorPyBfIDogXworPyBfIDogXworPyBfIDogXworXX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wMi0yOC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI4LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjOGRjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yOC5kYXRhCkBAIC0wLDAgKzEsMjYgQEAKKy0tLQorVGltZTogMjAwMS0xMS0yMyAxNTowMTo0MiAtNQorVXNlcjogZWQKK1dhcm5pbmc6CisgIFRoaXMgaXMgYW4gZXJyb3IgbWVzc2FnZQorICBmb3IgdGhlIGxvZyBmaWxlCistLS0KK1RpbWU6IDIwMDEtMTEtMjMgMTU6MDI6MzEgLTUKK1VzZXI6IGVkCitXYXJuaW5nOgorICBBIHNsaWdodGx5IGRpZmZlcmVudCBlcnJvcgorICBtZXNzYWdlLgorLS0tCitEYXRlOiAyMDAxLTExLTIzIDE1OjAzOjE3IC01CitVc2VyOiBlZAorRmF0YWw6CisgIFVua25vd24gdmFyaWFibGUgImJhciIKK1N0YWNrOgorICAtIGZpbGU6IFRvcENsYXNzLnB5CisgICAgbGluZTogMjMKKyAgICBjb2RlOiB8CisgICAgICB4ID0gTW9yZU9iamVjdCgiMzQ1XG4iKQorICAtIGZpbGU6IE1vcmVDbGFzcy5weQorICAgIGxpbmU6IDU4CisgICAgY29kZTogfC0KKyAgICAgIGZvbyA9IGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTAyLTI4LnN0cnVjdHVyZSBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yOC5zdHJ1Y3R1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMGI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wMi0yOC5zdHJ1Y3R1cmUKQEAgLTAsMCArMSwxMCBAQAorWworWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldLAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSldLAorWyhUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksCisoVHJ1ZSwgWworICAgIFsoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKSwgKFRydWUsIFRydWUpXSwKKyAgICBbKFRydWUsIFRydWUpLCAoVHJ1ZSwgVHJ1ZSksIChUcnVlLCBUcnVlKV0sCisgICAgXSksCitdCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDItMjgudG9rZW5zIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI4LnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDVlMWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTAyLTI4LnRva2VucwpAQCAtMCwwICsxLDIzIEBACistLS0KK3t7Cis/IF8gOiBfCis/IF8gOiBfCis/IF8gOiBfCitdfQorLS0tCit7eworPyBfIDogXworPyBfIDogXworPyBfIDogXworXX0KKy0tLQore3sKKz8gXyA6IF8KKz8gXyA6IF8KKz8gXyA6IF8KKz8gXyA6CisgICAgW1sKKyAgICAgICAgLCB7eyA/IF8gOiBfID8gXyA6IF8gPyBfIDogXyBdfQorICAgICAgICAsIHt7ID8gXyA6IF8gPyBfIDogXyA/IF8gOiBfIF19CisgICAgXX0KK119CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmMTZiZS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjE2YmUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI1MDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjE2YmUuZGF0YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmMTZiZS5lbXB0eSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMS11dGYxNmJlLmVtcHR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZmZhOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmMTZiZS5lbXB0eQpAQCAtMCwwICsxLDIgQEAKKyMgVGhpcyBzdHJlYW0gY29udGFpbnMgbm8KKyMgZG9jdW1lbnRzLCBvbmx5IGNvbW1lbnRzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjE2bGUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMS11dGYxNmxlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyM2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMS11dGYxNmxlLmRhdGEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjE2bGUuZW1wdHkgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmMTZsZS5lbXB0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZmYThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjE2bGUuZW1wdHkKQEAgLTAsMCArMSwyIEBACisjIFRoaXMgc3RyZWFtIGNvbnRhaW5zIG5vCisjIGRvY3VtZW50cywgb25seSBjb21tZW50cy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMS11dGY4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmOC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGQyNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmOC5kYXRhCkBAIC0wLDAgKzEgQEAKK++7vyMgQ29tbWVudCBvbmx5LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjguZW1wdHkgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDEtdXRmOC5lbXB0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZmYThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAxLXV0ZjguZW1wdHkKQEAgLTAsMCArMSwyIEBACisjIFRoaXMgc3RyZWFtIGNvbnRhaW5zIG5vCisjIGRvY3VtZW50cywgb25seSBjb21tZW50cy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGYxNmJlLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDItdXRmMTZiZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDItdXRmMTZiZS5kYXRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGYxNmJlLmVycm9yIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAyLXV0ZjE2YmUuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmMzYxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGYxNmJlLmVycm9yCkBAIC0wLDAgKzEsMyBAQAorRVJST1I6CisgQSBCT00gbXVzdCBub3QgYXBwZWFyCisgaW5zaWRlIGEgZG9jdW1lbnQuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDItdXRmMTZsZS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAyLXV0ZjE2bGUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q5MGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAyLXV0ZjE2bGUuZGF0YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDItdXRmMTZsZS5lcnJvciBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGYxNmxlLmVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjM2MTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDItdXRmMTZsZS5lcnJvcgpAQCAtMCwwICsxLDMgQEAKK0VSUk9SOgorIEEgQk9NIG11c3Qgbm90IGFwcGVhcgorIGluc2lkZSBhIGRvY3VtZW50LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTAyLXV0ZjguZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGY4LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NDg2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGY4LmRhdGEKQEAgLTAsMCArMSwzIEBACisjIEludmFsaWQgdXNlIG9mIEJPTQor77u/IyBpbnNpZGUgYQorIyBkb2N1bWVudC4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGY4LmVycm9yIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAyLXV0ZjguZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmMzYxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMi11dGY4LmVycm9yCkBAIC0wLDAgKzEsMyBAQAorRVJST1I6CisgQSBCT00gbXVzdCBub3QgYXBwZWFyCisgaW5zaWRlIGEgZG9jdW1lbnQuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDMuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAzLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQzYTczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTAzLmNhbm9uaWNhbApAQCAtMCwwICsxLDE0IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJzZXF1ZW5jZSIKKyAgOiAhIXNlcSBbCisgICAgISFzdHIgIm9uZSIsICEhc3RyICJ0d28iCisgIF0sCisgID8gISFzdHIgIm1hcHBpbmciCisgIDogISFtYXAgeworICAgID8gISFzdHIgInNreSIgOiAhIXN0ciAiYmx1ZSIsCisjICAgID8gISFzdHIgInNlYSIgOiAhIXN0ciAiZ3JlZW4iLAorICAgID8gISFtYXAgeyA/ICEhc3RyICJzZWEiIDogISFzdHIgImdyZWVuIiB9IDogISFudWxsICIiLAorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjFmMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDMuZGF0YQpAQCAtMCwwICsxLDcgQEAKK3NlcXVlbmNlOgorLSBvbmUKKy0gdHdvCittYXBwaW5nOgorICA/IHNreQorICA6IGJsdWUKKyAgPyBzZWEgOiBncmVlbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTA0LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjOTcyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNC5jYW5vbmljYWwKQEAgLTAsMCArMSwxMyBAQAorJVlBTUwgMS4xCistLS0KKyEhbWFwIHsKKyAgPyAhIXN0ciAic2VxdWVuY2UiCisgIDogISFzZXEgWworICAgICEhc3RyICJvbmUiLCAhIXN0ciAidHdvIgorICBdLAorICA/ICEhc3RyICJtYXBwaW5nIgorICA6ICEhbWFwIHsKKyAgICA/ICEhc3RyICJza3kiIDogISFzdHIgImJsdWUiLAorICAgID8gISFzdHIgInNlYSIgOiAhIXN0ciAiZ3JlZW4iLAorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDQuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzM4NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDQuZGF0YQpAQCAtMCwwICsxLDIgQEAKK3NlcXVlbmNlOiBbIG9uZSwgdHdvLCBdCittYXBwaW5nOiB7IHNreTogYmx1ZSwgc2VhOiBncmVlbiB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTI0YzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDUuZGF0YQpAQCAtMCwwICsxIEBACisjIENvbW1lbnQgb25seS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNS5lbXB0eSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNS5lbXB0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZmYThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA1LmVtcHR5CkBAIC0wLDAgKzEsMiBAQAorIyBUaGlzIHN0cmVhbSBjb250YWlucyBubworIyBkb2N1bWVudHMsIG9ubHkgY29tbWVudHMuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDYuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA2LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMwYzExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA2LmNhbm9uaWNhbApAQCAtMCwwICsxLDggQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgImFuY2hvcmVkIgorICA6ICZBMSAhbG9jYWwgInZhbHVlIiwKKyAgPyAhIXN0ciAiYWxpYXMiCisgIDogKkExLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTA2LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDYuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFmOWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA2LmRhdGEKQEAgLTAsMCArMSwyIEBACithbmNob3JlZDogIWxvY2FsICZhbmNob3IgdmFsdWUKK2FsaWFzOiAqYW5jaG9yCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMDcuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA3LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM3MzJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA3LmNhbm9uaWNhbApAQCAtMCwwICsxLDggQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgImxpdGVyYWwiCisgIDogISFzdHIgInRleHRcbiIsCisgID8gISFzdHIgImZvbGRlZCIKKyAgOiAhIXN0ciAidGV4dFxuIiwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlYjNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wNy5kYXRhCkBAIC0wLDAgKzEsNCBAQAorbGl0ZXJhbDogfAorICB0ZXh0Citmb2xkZWQ6ID4KKyAgdGV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTA4LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wOC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwYmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0wOC5jYW5vbmljYWwKQEAgLTAsMCArMSw4IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJzaW5nbGUiCisgIDogISFzdHIgInRleHQiLAorICA/ICEhc3RyICJkb3VibGUiCisgIDogISFzdHIgInRleHQiLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTA4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGViZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA4LmRhdGEKQEAgLTAsMCArMSwyIEBACitzaW5nbGU6ICd0ZXh0JworZG91YmxlOiAidGV4dCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0wOS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDkuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2UzZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDkuY2Fub25pY2FsCkBAIC0wLDAgKzEsMyBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJ0ZXh0IgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTA5LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMDkuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM0MzFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTA5LmRhdGEKQEAgLTAsMCArMSwyIEBACislWUFNTCAxLjEKKy0tLSB0ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTAuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Y2FmOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTAuZGF0YQpAQCAtMCwwICsxLDIgQEAKK2NvbW1lcmNpYWwtYXQ6IEB0ZXh0CitncmF2ZS1hY2NlbnQ6IGB0ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTAuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTAuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMC5lcnJvcgpAQCAtMCwwICsxLDMgQEAKK0VSUk9SOgorIFJlc2VydmVkIGluZGljYXRvcnMgY2FuJ3QKKyBzdGFydCBhIHBsYWluIHNjYWxhci4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTEuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjViZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTEuY2Fub25pY2FsCkBAIC0wLDAgKzEsNiBAQAorJVlBTUwgMS4xCistLS0gISFzdHIKKyJHZW5lcmljIGxpbmUgYnJlYWsgKG5vIGdseXBoKVxuXAorIEdlbmVyaWMgbGluZSBicmVhayAoZ2x5cGhlZClcblwKKyBMaW5lIHNlcGFyYXRvclx1MjAyOFwKKyBQYXJhZ3JhcGggc2VwYXJhdG9yXHUyMDI5IgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTExLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ4Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTExLmRhdGEKQEAgLTAsMCArMSwzIEBACit8CisgIEdlbmVyaWMgbGluZSBicmVhayAobm8gZ2x5cGgpCisgIEdlbmVyaWMgbGluZSBicmVhayAoZ2x5cGhlZCnChSAgTGluZSBzZXBhcmF0b3LigKggIFBhcmFncmFwaCBzZXBhcmF0b3LigKkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTIuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2FkN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTIuZGF0YQpAQCAtMCwwICsxLDkgQEAKKyMgVGFicyBkbydzIGFuZCBkb24ndHM6CisjIGNvbW1lbnQ6IAkKK3F1b3RlZDogIlF1b3RlZAkJIgorYmxvY2s6IHwKKyAgdm9pZCBtYWluKCkgeworICAJcHJpbnRmKCJIZWxsbywgd29ybGQhXG4iKTsKKyAgfQorZWxzZXdoZXJlOgkjIHNlcGFyYXRpb24KKwlpbmRlbnRhdGlvbiwgaW4JcGxhaW4gc2NhbGFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTIuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTIuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhZDRjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMi5lcnJvcgpAQCAtMCwwICsxLDggQEAKK0VSUk9SOgorIFRhYnMgbWF5IGFwcGVhciBpbnNpZGUKKyBjb21tZW50cyBhbmQgcXVvdGVkIG9yCisgYmxvY2sgc2NhbGFyIGNvbnRlbnQuCisgVGFicyBtdXN0IG5vdCBhcHBlYXIKKyBlbHNld2hlcmUsIHN1Y2ggYXMKKyBpbiBpbmRlbnRhdGlvbiBhbmQKKyBzZXBhcmF0aW9uIHNwYWNlcy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTMuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzFjNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTMuY2Fub25pY2FsCkBAIC0wLDAgKzEsNSBAQAorJVlBTUwgMS4xCistLS0gISFzdHIKKyJUZXh0IGNvbnRhaW5pbmcgXAorIGJvdGggc3BhY2UgYW5kIFwKKyB0YWIJY2hhcmFjdGVycyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTEzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNzk1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xMy5kYXRhCkBAIC0wLDAgKzEsMyBAQAorICAiVGV4dCBjb250YWluaW5nICAgCisgIGJvdGggc3BhY2UgYW5kCQorICAJdGFiCWNoYXJhY3RlcnMiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTQuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTE0LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZmMDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTE0LmNhbm9uaWNhbApAQCAtMCwwICsxLDcgQEAKKyVZQU1MIDEuMQorLS0tCisiRnVuIHdpdGggXHg1QworIFx4MjIgXHgwNyBceDA4IFx4MUIgXHgwQworIFx4MEEgXHgwRCBceDA5IFx4MEIgXHgwMAorIFx4MjAgXHhBMCBceDg1IFx1MjAyOCBcdTIwMjkKKyBBIEEgQSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNS0xNC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTE0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlOGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xNC5kYXRhCkBAIC0wLDAgKzEsMiBAQAorIkZ1biB3aXRoIFxcCisgXCIgXGEgXGIgXGUgXGYgXMKFIFxuIFxyIFx0IFx2IFwwIFzigKggXCAgXF8gXE4gXEwgXFAgXOKAqSBceDQxIFx1MDA0MSBcVTAwMDAwMDQxIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA1LTE1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmYxMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA1LTE1LmRhdGEKQEAgLTAsMCArMSwzIEBACitCYWQgZXNjYXBlczoKKyAgIlxjCisgIFx4cS0iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDUtMTUuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDUtMTUuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmZmJkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNS0xNS5lcnJvcgpAQCAtMCwwICsxLDMgQEAKK0VSUk9SOgorLSBjIGlzIGFuIGludmFsaWQgZXNjYXBlZCBjaGFyYWN0ZXIuCistIHEgYW5kIC0gYXJlIGludmFsaWQgaGV4IGRpZ2l0cy4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDEuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxN2VjOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDEuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTUgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgIk5vdCBpbmRlbnRlZCIKKyAgOiAhIW1hcCB7CisgICAgICA/ICEhc3RyICJCeSBvbmUgc3BhY2UiCisgICAgICA6ICEhc3RyICJCeSBmb3VyXG4gIHNwYWNlc1xuIiwKKyAgICAgID8gISFzdHIgIkZsb3cgc3R5bGUiCisgICAgICA6ICEhc2VxIFsKKyAgICAgICAgICAhIXN0ciAiQnkgdHdvIiwKKyAgICAgICAgICAhIXN0ciAiQWxzbyBieSB0d28iLAorICAgICAgICAgICEhc3RyICJTdGlsbCBieSB0d28iLAorICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTAxLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM0YmExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTAxLmRhdGEKQEAgLTAsMCArMSwxNCBAQAorICAjIExlYWRpbmcgY29tbWVudCBsaW5lIHNwYWNlcyBhcmUKKyAgICMgbmVpdGhlciBjb250ZW50IG5vciBpbmRlbnRhdGlvbi4KKyAgICAKK05vdCBpbmRlbnRlZDoKKyBCeSBvbmUgc3BhY2U6IHwKKyAgICBCeSBmb3VyCisgICAgICBzcGFjZXMKKyBGbG93IHN0eWxlOiBbICAgICMgTGVhZGluZyBzcGFjZXMKKyAgIEJ5IHR3bywgICAgICAgICMgaW4gZmxvdyBzdHlsZQorICBBbHNvIGJ5IHR3bywgICAgIyBhcmUgbmVpdGhlcgorIyBUYWJzIGFyZSBub3QgYWxsb3dlZDoKKyMgIAlTdGlsbCBieSB0d28gICAjIGNvbnRlbnQgbm9yCisgICAgU3RpbGwgYnkgdHdvICAgIyBjb250ZW50IG5vcgorICAgIF0gICAgICAgICAgICAgIyBpbmRlbnRhdGlvbi4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTAyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NDFlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMi5kYXRhCkBAIC0wLDAgKzEsMyBAQAorICAjIENvbW1lbnQKKyAgIAorCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDYtMDIuZW1wdHkgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDIuZW1wdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmZmE4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMi5lbXB0eQpAQCAtMCwwICsxLDIgQEAKKyMgVGhpcyBzdHJlYW0gY29udGFpbnMgbm8KKyMgZG9jdW1lbnRzLCBvbmx5IGNvbW1lbnRzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTAzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNjkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wMy5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJrZXkiCisgIDogISFzdHIgInZhbHVlIgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTAzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIwOTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTAzLmRhdGEKQEAgLTAsMCArMSwyIEBACitrZXk6ICAgICMgQ29tbWVudAorICB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTA0LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNjkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNC5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJrZXkiCisgIDogISFzdHIgInZhbHVlIgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTA0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjMwOGRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA0LmRhdGEKQEAgLTAsMCArMSw0IEBACitrZXk6ICAgICMgQ29tbWVudAorICAgICAgICAjIGxpbmVzCisgIHZhbHVlCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDUuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTQzMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDUuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTYgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFtYXAgeworICAgID8gISFzdHIgImZpcnN0IgorICAgIDogISFzdHIgIlNhbW15IiwKKyAgICA/ICEhc3RyICJsYXN0IgorICAgIDogISFzdHIgIlNvc2EiCisgIH0KKyAgOiAhIW1hcCB7CisgICAgPyAhIXN0ciAiaHIiCisgICAgOiAhIWludCAiNjUiLAorICAgID8gISFzdHIgImF2ZyIKKyAgICA6ICEhZmxvYXQgIjAuMjc4IgorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDYtMDUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjEzZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDUuZGF0YQpAQCAtMCwwICsxLDYgQEAKK3sgZmlyc3Q6IFNhbW15LCBsYXN0OiBTb3NhIH06CisjIFN0YXRpc3RpY3M6CisgIGhyOiAgIyBIb21lIHJ1bnMKKyAgICA2NQorICBhdmc6ICMgQXZlcmFnZQorICAgIDAuMjc4CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDYtMDYuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA2LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNkMDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA2LmNhbm9uaWNhbApAQCAtMCwwICsxLDEwIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJwbGFpbiIKKyAgOiAhIXN0ciAidGV4dCBsaW5lcyIsCisgID8gISFzdHIgInF1b3RlZCIKKyAgOiAhIXN0ciAidGV4dCBsaW5lcyIsCisgID8gISFzdHIgImJsb2NrIgorICA6ICEhc3RyICJ0ZXh0XG4gCWxpbmVzXG4iCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDYtMDYuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjJkMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDYuZGF0YQpAQCAtMCwwICsxLDcgQEAKK3BsYWluOiB0ZXh0CisgIGxpbmVzCitxdW90ZWQ6ICJ0ZXh0CisgIAlsaW5lcyIKK2Jsb2NrOiB8CisgIHRleHQKKyAgIAlsaW5lcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTA3LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzNTdlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNy5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiZm9vXG5iYXIiLAorICAhIXN0ciAiZm9vXG5cbmJhciIKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwY2ZhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNi0wNy5kYXRhCkBAIC0wLDAgKzEsOCBAQAorLSBmb28KKyAKKyAgYmFyCistIHwtCisgIGZvbworIAorICBiYXIKKyAgCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDYtMDguY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA4LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzcyYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA4LmNhbm9uaWNhbApAQCAtMCwwICsxLDUgQEAKKyVZQU1MIDEuMQorLS0tICEhc3RyCisic3BlY2lmaWNcTFwKKyB0cmltbWVkXG5cblxuXAorIGFzIHNwYWNlIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA2LTA4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDYtMDguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg5NmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA2LTA4LmRhdGEKQEAgLTAsMCArMSwyIEBACis+LQorICBzcGVjaWZpY+KAqCAgdHJpbW1lZMKFICDChSDChcKFICBhc8KFICBzcGFjZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTAxLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4YzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMS5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLSAhIXN0cgorImZvbyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTAxLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExM2ViNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMS5kYXRhCkBAIC0wLDAgKzEsMyBAQAorJUZPTyAgYmFyIGJheiAjIFNob3VsZCBiZSBpZ25vcmVkCisgICAgICAgICAgICAgICAjIHdpdGggYSB3YXJuaW5nLgorLS0tICJmb28iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMDEuc2tpcC1leHQgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDEuc2tpcC1leHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMS5za2lwLWV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTAyLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZGQxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTAyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiNzMyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5kYXRhCkBAIC0wLDAgKzEsNCBAQAorJVlBTUwgMS4yICMgQXR0ZW1wdCBwYXJzaW5nCisgICAgICAgICAgICMgd2l0aCBhIHdhcm5pbmcKKy0tLQorImZvbyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5za2lwLWV4dCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMi5za2lwLWV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTAyLnNraXAtZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMDMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmEwN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDMuZGF0YQpAQCAtMCwwICsxLDMgQEAKKyVZQU1MIDEuMQorJVlBTUwgMS4xCitmb28KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMy5lcnJvciBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wMy5lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFjNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTAzLmVycm9yCkBAIC0wLDAgKzEsMyBAQAorRVJST1I6CitUaGUgWUFNTCBkaXJlY3RpdmUgbXVzdCBvbmx5IGJlCitnaXZlbiBhdCBtb3N0IG9uY2UgcGVyIGRvY3VtZW50LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA0LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZGQxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNC5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNWFiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNC5kYXRhCkBAIC0wLDAgKzEsMyBAQAorJVRBRyAheWFtbCEgdGFnOnlhbWwub3JnLDIwMDI6CistLS0KKyF5YW1sIXN0ciAiZm9vIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc2ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA1LmRhdGEKQEAgLTAsMCArMSwzIEBACislVEFHICEgIWZvbworJVRBRyAhICFmb28KK2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA1LmVycm9yIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA1LmVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDFiMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDUuZXJyb3IKQEAgLTAsMCArMSw0IEBACitFUlJPUjoKK1RoZSBUQUcgZGlyZWN0aXZlIG11c3Qgb25seQorYmUgZ2l2ZW4gYXQgbW9zdCBvbmNlIHBlcgoraGFuZGxlIGluIHRoZSBzYW1lIGRvY3VtZW50LgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA2LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkZjYxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNi5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhPCFmb29iYXI+ICJiYXoiLAorICAhPHRhZzp5YW1sLm9yZywyMDAyOnN0cj4gInN0cmluZyIKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA2LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4NTRjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wNi5kYXRhCkBAIC0wLDAgKzEsNSBAQAorJVRBRyAhICAgICAgIWZvbworJVRBRyAheWFtbCEgdGFnOnlhbWwub3JnLDIwMDI6CistLS0KKy0gIWJhciAiYmF6IgorLSAheWFtbCFzdHIgInN0cmluZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2EuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA3YS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwODZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2EuY2Fub25pY2FsCkBAIC0wLDAgKzEsMyBAQAorJVlBTUwgMS4xCistLS0KKyE8IWZvbz4gImJhciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2EuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2EuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQyZWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA3YS5kYXRhCkBAIC0wLDAgKzEsMiBAQAorIyBQcml2YXRlIGFwcGxpY2F0aW9uOgorIWZvbyAiYmFyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA3Yi5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDdiLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkxN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA3Yi5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLQorITx0YWc6YmVuLWtpa2kub3JnLDIwMDA6YXBwL2Zvbz4gImJhciIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2IuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wN2IuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM2ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTA3Yi5kYXRhCkBAIC0wLDAgKzEsNCBAQAorIyBNaWdyYXRlZCB0byBnbG9iYWw6CislVEFHICEgdGFnOmJlbi1raWtpLm9yZywyMDAwOmFwcC8KKy0tLQorIWZvbyAiYmFyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA4LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzYWE3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOC5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhPCFmb28+ICJiYXIiLAorICAhPHRhZzp5YW1sLm9yZywyMDAyOnN0cj4gInN0cmluZyIsCisgICE8dGFnOmJlbi1raWtpLm9yZywyMDAwOnR5cGU+ICJiYXoiCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMDguZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzZkOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDguZGF0YQpAQCAtMCwwICsxLDkgQEAKKyMgRXhwbGljaXRseSBzcGVjaWZ5IGRlZmF1bHQgc2V0dGluZ3M6CislVEFHICEgICAgICEKKyVUQUcgISEgICAgdGFnOnlhbWwub3JnLDIwMDI6CisjIE5hbWVkIGhhbmRsZXMgaGF2ZSBubyBkZWZhdWx0OgorJVRBRyAhbyEgdGFnOmJlbi1raWtpLm9yZywyMDAwOgorLS0tCistICFmb28gImJhciIKKy0gISFzdHIgInN0cmluZyIKKy0gIW8hdHlwZSAiYmF6IgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTA5LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkOWU5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOS5jYW5vbmljYWwKQEAgLTAsMCArMSw5IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbyIKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiYmFyIgorJVlBTUwgMS4xCistLS0KKyEhc3RyICJiYXoiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMDkuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0wOS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDlkNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMDkuZGF0YQpAQCAtMCwwICsxLDExIEBACistLS0KK2ZvbworLi4uCisjIFJlcGVhdGVkIGVuZCBtYXJrZXIuCisuLi4KKy0tLQorYmFyCisjIE5vIGVuZCBtYXJrZXIuCistLS0KK2JhegorLi4uCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMTAuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEwLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGI2NTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEwLmNhbm9uaWNhbApAQCAtMCwwICsxLDE1IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgIlJvb3QgZmxvdyBzY2FsYXIiCislWUFNTCAxLjEKKy0tLQorISFzdHIgIlJvb3QgYmxvY2sgc2NhbGFyXG4iCislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJmb28iCisgIDogISFzdHIgImJhciIKK30KKy0tLQorIyEhc3RyICIiCishIW51bGwgIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzOWIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMC5kYXRhCkBAIC0wLDAgKzEsMTEgQEAKKyJSb290IGZsb3cKKyBzY2FsYXIiCistLS0gISFzdHIgPgorIFJvb3QgYmxvY2sKKyBzY2FsYXIKKy0tLQorIyBSb290IGNvbGxlY3Rpb246Citmb28gOiBiYXIKKy4uLiAjIElzIG9wdGlvbmFsLgorLS0tCisjIEV4cGxpY2l0IGRvY3VtZW50IG1heSBiZSBlbXB0eS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTExLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExMzAyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMS5kYXRhCkBAIC0wLDAgKzEsMiBAQAor77u/IyBBIHN0cmVhbSBtYXkgY29udGFpbgorIyBubyBkb2N1bWVudHMuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMTEuZW1wdHkgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTEuZW1wdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmZmE4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMS5lbXB0eQpAQCAtMCwwICsxLDIgQEAKKyMgVGhpcyBzdHJlYW0gY29udGFpbnMgbm8KKyMgZG9jdW1lbnRzLCBvbmx5IGNvbW1lbnRzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA3LTEyYS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTJhLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmMxMTZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEyYS5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJmb28iCisgIDogISFzdHIgImJhciIKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMmEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMmEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA3ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEyYS5kYXRhCkBAIC0wLDAgKzEsMyBAQAorIyBJbXBsaWNpdCBkb2N1bWVudC4gUm9vdAorIyBjb2xsZWN0aW9uIChtYXBwaW5nKSBub2RlLgorZm9vIDogYmFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMTJiLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMmIuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmNmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTJiLmNhbm9uaWNhbApAQCAtMCwwICsxLDMgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiVGV4dCBjb250ZW50XG4iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDctMTJiLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTJiLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyNTBkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMmIuZGF0YQpAQCAtMCwwICsxLDQgQEAKKyMgRXhwbGljaXQgZG9jdW1lbnQuIFJvb3QKKyMgc2NhbGFyIChsaXRlcmFsKSBub2RlLgorLS0tIHwKKyBUZXh0IGNvbnRlbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTMuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjcxZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDctMTMuY2Fub25pY2FsCkBAIC0wLDAgKzEsOSBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJGaXJzdCBkb2N1bWVudCIKKy0tLQorITwhZm9vPiAiTm8gZGlyZWN0aXZlcyIKKy0tLQorITwhZm9vYmFyPiAiV2l0aCBkaXJlY3RpdmVzIgorLS0tCishPCFiYXo+ICJSZXNldCBzZXR0aW5ncyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA3LTEzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3ZWM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wNy0xMy5kYXRhCkBAIC0wLDAgKzEsOSBAQAorISAiRmlyc3QgZG9jdW1lbnQiCistLS0KKyFmb28gIk5vIGRpcmVjdGl2ZXMiCislVEFHICEgIWZvbworLS0tCishYmFyICJXaXRoIGRpcmVjdGl2ZXMiCislWUFNTCAxLjEKKy0tLQorIWJheiAiUmVzZXQgc2V0dGluZ3MiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDEuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTAxLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU0MTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTAxLmNhbm9uaWNhbApAQCAtMCwwICsxLDggQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gJkExICEhc3RyICJmb28iCisgIDogISFzdHIgImJhciIsCisgID8gJkEyICEhc3RyICJiYXoiCisgIDogKkExCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wMS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTg2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDEuZGF0YQpAQCAtMCwwICsxLDIgQEAKKyEhc3RyICZhMSAiZm9vIiA6ICEhc3RyIGJhcgorJmEyIGJheiA6ICphMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTAyLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wMi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2Zjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wMi5jYW5vbmljYWwKQEAgLTAsMCArMSw4IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJGaXJzdCBvY2N1cnJlbmNlIgorICA6ICZBICEhc3RyICJWYWx1ZSIsCisgID8gISFzdHIgIlNlY29uZCBvY2N1cnJlbmNlIgorICA6ICpBCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDIuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wMi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGQxNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDIuZGF0YQpAQCAtMCwwICsxLDIgQEAKK0ZpcnN0IG9jY3VycmVuY2U6ICZhbmNob3IgVmFsdWUKK1NlY29uZCBvY2N1cnJlbmNlOiAqYW5jaG9yCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDMuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTAzLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdlYThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTAzLmNhbm9uaWNhbApAQCAtMCwwICsxLDYgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gITx0YWc6eWFtbC5vcmcsMjAwMjpzdHI+ICJmb28iCisgIDogITwhYmFyPiAiYmF6IgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTAzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTUxZjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTAzLmRhdGEKQEAgLTAsMCArMSwyIEBACishPHRhZzp5YW1sLm9yZywyMDAyOnN0cj4gZm9vIDoKKyAgITwhYmFyPiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMWIwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNC5kYXRhCkBAIC0wLDAgKzEsMiBAQAorLSAhPCE+IGZvbworLSAhPCQ6Pz4gYmFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDQuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDQuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2NjM3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNC5lcnJvcgpAQCAtMCwwICsxLDYgQEAKK0VSUk9SOgorLSBWZXJiYXRpbSB0YWdzIGFyZW4ndCByZXNvbHZlZCwKKyAgc28gISBpcyBpbnZhbGlkLgorLSBUaGUgJDo/IHRhZyBpcyBuZWl0aGVyIGEgZ2xvYmFsCisgIFVSSSB0YWcgbm9yIGEgbG9jYWwgdGFnIHN0YXJ0aW5nCisgIHdpdGgg4oCcIeKAnS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDUuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzcxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDUuY2Fub25pY2FsCkBAIC0wLDAgKzEsNyBAQAorJVlBTUwgMS4xCistLS0KKyEhc2VxIFsKKyAgITwhbG9jYWw+ICJmb28iLAorICAhPHRhZzp5YW1sLm9yZywyMDAyOnN0cj4gImJhciIsCisgICE8dGFnOmJlbi1raWtpLm9yZywyMDAwOnR5cGU+ICJiYXoiLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTA1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU3NmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA1LmRhdGEKQEAgLTAsMCArMSw1IEBACislVEFHICFvISB0YWc6YmVuLWtpa2kub3JnLDIwMDA6CistLS0KKy0gIWxvY2FsIGZvbworLSAhIXN0ciBiYXIKKy0gIW8hdHlwZSBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA2LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4MDAxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNi5kYXRhCkBAIC0wLDAgKzEsNSBAQAorJVRBRyAhbyEgdGFnOmJlbi1raWtpLm9yZywyMDAwOgorLS0tCistICEkYSFiIGZvbworLSAhbyEgYmFyCistICFoIXR5cGUgYmF6CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDYuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDYuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NmY0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNi5lcnJvcgpAQCAtMCwwICsxLDQgQEAKK0VSUk9SOgorLSBUaGUgISRhISBsb29rcyBsaWtlIGEgaGFuZGxlLgorLSBUaGUgIW8hIGhhbmRsZSBoYXMgbm8gc3VmZml4LgorLSBUaGUgIWghIGhhbmRsZSB3YXNuJ3QgZGVjbGFyZWQuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDcuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA3LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmY0M2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA3LmNhbm9uaWNhbApAQCAtMCwwICsxLDggQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICE8dGFnOnlhbWwub3JnLDIwMDI6c3RyPiAiMTIiLAorICAhPHRhZzp5YW1sLm9yZywyMDAyOmludD4gIjEyIiwKKyMgICE8dGFnOnlhbWwub3JnLDIwMDI6c3RyPiAiMTIiLAorICAhPHRhZzp5YW1sLm9yZywyMDAyOmludD4gIjEyIiwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhYTU2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wNy5kYXRhCkBAIC0wLDAgKzEsNCBAQAorIyBBc3N1bWluZyBjb252ZW50aW9uYWwgcmVzb2x1dGlvbjoKKy0gIjEyIgorLSAxMgorLSAhIDEyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDguY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA4LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y4YjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA4LmNhbm9uaWNhbApAQCAtMCwwICsxLDE1IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJmb28iCisgIDogISFzdHIgImJhciBiYXoiCit9CislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbyBiYXIiCislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbyBiYXIiCislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvb1xuIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTA4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdhOTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA4LmRhdGEKQEAgLTAsMCArMSwxMyBAQAorLS0tCitmb286CisgImJhcgorIGJheiIKKy0tLQorImZvbworIGJhciIKKy0tLQorZm9vCisgYmFyCistLS0gfAorIGZvbworLi4uCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDkuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA5LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTA5LmNhbm9uaWNhbApAQCAtMCwwICsxLDIxIEBACislWUFNTCAxLjEKKy0tLSAhIW1hcCB7CisgID8gISFzdHIgInNjYWxhcnMiIDogISFtYXAgeworICAgICAgPyAhIXN0ciAicGxhaW4iCisgICAgICA6ICEhc3RyICJzb21lIHRleHQiLAorICAgICAgPyAhIXN0ciAicXVvdGVkIgorICAgICAgOiAhIW1hcCB7CisgICAgICAgID8gISFzdHIgInNpbmdsZSIKKyAgICAgICAgOiAhIXN0ciAic29tZSB0ZXh0IiwKKyAgICAgICAgPyAhIXN0ciAiZG91YmxlIgorICAgICAgICA6ICEhc3RyICJzb21lIHRleHQiCisgIH0gfSwKKyAgPyAhIXN0ciAiY29sbGVjdGlvbnMiIDogISFtYXAgeworICAgID8gISFzdHIgInNlcXVlbmNlIiA6ICEhc2VxIFsKKyAgICAgICEhc3RyICJlbnRyeSIsCisgICAgICAhIW1hcCB7CisgICAgICAgID8gISFzdHIgImtleSIgOiAhIXN0ciAidmFsdWUiCisgICAgfSBdLAorICAgID8gISFzdHIgIm1hcHBpbmciIDogISFtYXAgeworICAgICAgPyAhIXN0ciAia2V5IiA6ICEhc3RyICJ2YWx1ZSIKK30gfSB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMDkuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0wOS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZGEwNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMDkuZGF0YQpAQCAtMCwwICsxLDExIEBACistLS0KK3NjYWxhcnM6CisgIHBsYWluOiAhIXN0ciBzb21lIHRleHQKKyAgcXVvdGVkOgorICAgIHNpbmdsZTogJ3NvbWUgdGV4dCcKKyAgICBkb3VibGU6ICJzb21lIHRleHQiCitjb2xsZWN0aW9uczoKKyAgc2VxdWVuY2U6ICEhc2VxIFsgISFzdHIgZW50cnksCisgICAgIyBNYXBwaW5nIGVudHJ5OgorICAgICAga2V5OiB2YWx1ZSBdCisgIG1hcHBpbmc6IHsga2V5OiB2YWx1ZSB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMTAuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEwLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgxYzVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEwLmNhbm9uaWNhbApAQCAtMCwwICsxLDIzIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJibG9jayBzdHlsZXMiIDogISFtYXAgeworICAgID8gISFzdHIgInNjYWxhcnMiIDogISFtYXAgeworICAgICAgPyAhIXN0ciAibGl0ZXJhbCIKKyAgICAgIDogISFzdHIgIiMhL3Vzci9iaW4vcGVybFxuXAorICAgICAgICAgIHByaW50IFwiSGVsbG8sCisgICAgICAgICAgd29ybGQhXFxuXCI7XG4iLAorICAgICAgPyAhIXN0ciAiZm9sZGVkIgorICAgICAgOiAhIXN0ciAiVGhpcyBzZW50ZW5jZQorICAgICAgICAgIGlzIGZhbHNlLlxuIgorICAgIH0sCisgICAgPyAhIXN0ciAiY29sbGVjdGlvbnMiIDogISFtYXAgeworICAgICAgPyAhIXN0ciAic2VxdWVuY2UiIDogISFzZXEgWworICAgICAgICAhIXN0ciAiZW50cnkiLAorICAgICAgICAhIW1hcCB7CisgICAgICAgICAgPyAhIXN0ciAia2V5IiA6ICEhc3RyICJ2YWx1ZSIKKyAgICAgICAgfQorICAgICAgXSwKKyAgICAgID8gISFzdHIgIm1hcHBpbmciIDogISFtYXAgeworICAgICAgICA/ICEhc3RyICJrZXkiIDogISFzdHIgInZhbHVlIgorfSB9IH0gfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTEwLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTAuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmFjYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEwLmRhdGEKQEAgLTAsMCArMSwxNSBAQAorYmxvY2sgc3R5bGVzOgorICBzY2FsYXJzOgorICAgIGxpdGVyYWw6ICEhc3RyIHwKKyAgICAgICMhL3Vzci9iaW4vcGVybAorICAgICAgcHJpbnQgIkhlbGxvLCB3b3JsZCFcbiI7CisgICAgZm9sZGVkOiA+CisgICAgICBUaGlzIHNlbnRlbmNlCisgICAgICBpcyBmYWxzZS4KKyAgY29sbGVjdGlvbnM6ICEhbWFwCisgICAgc2VxdWVuY2U6ICEhc2VxICMgRW50cnk6CisgICAgICAtIGVudHJ5ICMgUGxhaW4KKyAgICAgICMgTWFwcGluZyBlbnRyeToKKyAgICAgIC0ga2V5OiB2YWx1ZQorICAgIG1hcHBpbmc6IAorICAgICAga2V5OiB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTExLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2Zjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMS5jYW5vbmljYWwKQEAgLTAsMCArMSw4IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJGaXJzdCBvY2N1cnJlbmNlIgorICA6ICZBICEhc3RyICJWYWx1ZSIsCisgID8gISFzdHIgIlNlY29uZCBvY2N1cnJlbmNlIgorICA6ICpBCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMTEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGQxNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTEuZGF0YQpAQCAtMCwwICsxLDIgQEAKK0ZpcnN0IG9jY3VycmVuY2U6ICZhbmNob3IgVmFsdWUKK1NlY29uZCBvY2N1cnJlbmNlOiAqYW5jaG9yCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMTIuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEyLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg5OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEyLmNhbm9uaWNhbApAQCAtMCwwICsxLDEwIEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiV2l0aG91dCBwcm9wZXJ0aWVzIiwKKyAgJkEgISFzdHIgIkFuY2hvcmVkIiwKKyAgISFzdHIgIlRhZ2dlZCIsCisgICpBLAorICAhIXN0ciAiIiwKKyAgISFzdHIgIiIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMTIuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGM2YjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTIuZGF0YQpAQCAtMCwwICsxLDggQEAKK1sKKyAgV2l0aG91dCBwcm9wZXJ0aWVzLAorICAmYW5jaG9yICJBbmNob3JlZCIsCisgICEhc3RyICdUYWdnZWQnLAorICAqYW5jaG9yLCAjIEFsaWFzIG5vZGUKKyAgISFzdHIgLCAgIyBFbXB0eSBwbGFpbiBzY2FsYXIKKyAgJycsICAgIyBFbXB0eSBwbGFpbiBzY2FsYXIKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMy5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTMuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOGJiN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTMuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTAgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgImZvbyIKKyMgIDogISFzdHIgIiIsCisjICA/ICEhc3RyICIiCisgIDogISFudWxsICIiLAorICA/ICEhbnVsbCAiIgorICA6ICEhc3RyICJiYXIiLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTEzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU2NjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTEzLmRhdGEKQEAgLTAsMCArMSw0IEBACit7CisgID8gZm9vIDosCisgID8gOiBiYXIsCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDgtMTMuc2tpcC1leHQgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTMuc2tpcC1leHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xMy5za2lwLWV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTE0LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xNC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkYjQzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xNC5jYW5vbmljYWwKQEAgLTAsMCArMSwxMCBAQAorJVlBTUwgMS4xCistLS0KKyEhc2VxIFsKKyAgISFzdHIgImZsb3cgaW4gYmxvY2siLAorICAhIXN0ciAiQmxvY2sgc2NhbGFyXG4iLAorICAhIW1hcCB7CisgICAgPyAhIXN0ciAiZm9vIgorICAgIDogISFzdHIgImJhciIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA4LTE0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJiMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTE0LmRhdGEKQEAgLTAsMCArMSw1IEBACistICJmbG93IGluIGJsb2NrIgorLSA+CisgQmxvY2sgc2NhbGFyCistICEhbWFwICMgQmxvY2sgY29sbGVjdGlvbgorICBmb28gOiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0xNS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTUuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjAyOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDgtMTUuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTEgQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhbnVsbCAiIiwKKyAgISFtYXAgeworICAgID8gISFzdHIgImZvbyIKKyAgICA6ICEhbnVsbCAiIiwKKyAgICA/ICEhbnVsbCAiIgorICAgIDogISFzdHIgImJhciIsCisgIH0KK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOC0xNS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA4LTE1LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NmJjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOC0xNS5kYXRhCkBAIC0wLDAgKzEsNSBAQAorLSAjIEVtcHR5IHBsYWluIHNjYWxhcgorLSA/IGZvbworICA6CisgID8KKyAgOiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDEuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWE1NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDEuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTEgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgInNpbXBsZSBrZXkiCisgIDogISFtYXAgeworICAgID8gISFzdHIgImFsc28gc2ltcGxlIgorICAgIDogISFzdHIgInZhbHVlIiwKKyAgICA/ICEhc3RyICJub3QgYSBzaW1wbGUga2V5IgorICAgIDogISFzdHIgImFueSB2YWx1ZSIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTAxLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgzZWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTAxLmRhdGEKQEAgLTAsMCArMSw2IEBACisic2ltcGxlIGtleSIgOiB7CisgICJhbHNvIHNpbXBsZSIgOiB2YWx1ZSwKKyAgPyAibm90IGEKKyAgc2ltcGxlIGtleSIgOiAiYW55CisgIHZhbHVlIgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTAyLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMi5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImFzIHNwYWNlIFwKKyAgdHJpbW1lZFxuXAorICBzcGVjaWZpY1xMXG5cCisgIGVzY2FwZWRcdFxuXAorICBub25lIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTAyLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ4ODNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTAyLmRhdGEKQEAgLTAsMCArMSw2IEBACisgImFzIHNwYWNlCQorIHRyaW1tZWQgCisKKyBzcGVjaWZpY+KAqAorIGVzY2FwZWQJXOKAqSAKKyBub25lIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTAzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YzZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMy5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiIGxhc3QiLAorICAhIXN0ciAiIGxhc3QiLAorICAhIXN0ciAiIFx0Zmlyc3QgbGFzdCIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjkxNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDMuZGF0YQpAQCAtMCwwICsxLDYgQEAKKy0gIgorICBsYXN0IgorLSAiIAkKKyAgbGFzdCIKKy0gIiAJZmlyc3QKKyAgbGFzdCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDQuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDY2MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDQuY2Fub25pY2FsCkBAIC0wLDAgKzEsNiBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJmaXJzdCBcCisgIGlubmVyIDEgIFwKKyAgaW5uZXIgMiBcCisgIGxhc3QiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDQuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2E5MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDQuZGF0YQpAQCAtMCwwICsxLDQgQEAKKyAiZmlyc3QKKyAJaW5uZXIgMQkKKyBcIGlubmVyIDIgXAorIGxhc3QiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDUuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA1LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQxMDUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA1LmNhbm9uaWNhbApAQCAtMCwwICsxLDcgQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhc3RyICJmaXJzdCAiLAorICAhIXN0ciAiZmlyc3Rcbmxhc3QiLAorICAhIXN0ciAiZmlyc3QgaW5uZXIgIFx0bGFzdCIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDUuZGF0YQpAQCAtMCwwICsxLDggQEAKKy0gImZpcnN0CisgIAkiCistICJmaXJzdAorCisgIAlsYXN0IgorLSAiZmlyc3QKKyBpbm5lcgorIFwgCWxhc3QiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDYuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA2LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDI4NzcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA2LmNhbm9uaWNhbApAQCAtMCwwICsxLDMgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiaGVyZSdzIHRvIFwicXVvdGVzXCIiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDYuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzgwNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDYuZGF0YQpAQCAtMCwwICsxIEBACisgJ2hlcmUnJ3MgdG8gInF1b3RlcyInCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDcuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA3LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzFhNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA3LmNhbm9uaWNhbApAQCAtMCwwICsxLDExIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJzaW1wbGUga2V5IgorICA6ICEhbWFwIHsKKyAgICA/ICEhc3RyICJhbHNvIHNpbXBsZSIKKyAgICA6ICEhc3RyICJ2YWx1ZSIsCisgICAgPyAhIXN0ciAibm90IGEgc2ltcGxlIGtleSIKKyAgICA6ICEhc3RyICJhbnkgdmFsdWUiCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1YjU0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wNy5kYXRhCkBAIC0wLDAgKzEsNiBAQAorJ3NpbXBsZSBrZXknIDogeworICAnYWxzbyBzaW1wbGUnIDogdmFsdWUsCisgID8gJ25vdCBhCisgIHNpbXBsZSBrZXknIDogJ2FueQorICB2YWx1ZScKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0wOC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDguY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWJkYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDguY2Fub25pY2FsCkBAIC0wLDAgKzEsNiBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJhcyBzcGFjZSBcCisgIHRyaW1tZWRcblwKKyAgc3BlY2lmaWNcTFxuXAorICBub25lIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTA4LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTA4LmRhdGEKQEAgLTAsMCArMSBAQAorICdhcyBzcGFjZQnChSB0cmltbWVkIMKFwoUgc3BlY2lmaWPigKjChSBub25lJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTA5LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wOS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YzZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wOS5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiIGxhc3QiLAorICAhIXN0ciAiIGxhc3QiLAorICAhIXN0ciAiIFx0Zmlyc3QgbGFzdCIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMDkuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0wOS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMDkuZGF0YQpAQCAtMCwwICsxLDYgQEAKKy0gJworICBsYXN0JworLSAnIAkKKyAgbGFzdCcKKy0gJyAJZmlyc3QKKyAgbGFzdCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTAuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjhkMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTAuY2Fub25pY2FsCkBAIC0wLDAgKzEsNSBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJmaXJzdCBcCisgIGlubmVyIFwKKyAgbGFzdCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTEwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0MTQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMC5kYXRhCkBAIC0wLDAgKzEsMyBAQAorICdmaXJzdAorIAlpbm5lcgkKKyBsYXN0JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTExLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViMjIyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMS5jYW5vbmljYWwKQEAgLTAsMCArMSw2IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiZmlyc3QgIiwKKyAgISFzdHIgImZpcnN0XG5sYXN0IiwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTExLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmYTg3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMS5kYXRhCkBAIC0wLDAgKzEsNSBAQAorLSAnZmlyc3QKKyAgCScKKy0gJ2ZpcnN0CisKKyAgCWxhc3QnCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTIuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTEyLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGU2ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTEyLmNhbm9uaWNhbApAQCAtMCwwICsxLDEyIEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIXN0ciAiOjpzdGQ6OnZlY3RvciIsCisgICEhc3RyICJVcCwgdXAsIGFuZCBhd2F5ISIsCisgICEhaW50ICItMTIzIiwKKyAgISFzZXEgWworICAgICEhc3RyICI6OnN0ZDo6dmVjdG9yIiwKKyAgICAhIXN0ciAiVXAsIHVwLCBhbmQgYXdheSEiLAorICAgICEhaW50ICItMTIzIiwKKyAgXQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTEyLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWEzYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTEyLmRhdGEKQEAgLTAsMCArMSw4IEBACisjIE91dHNpZGUgZmxvdyBjb2xsZWN0aW9uOgorLSA6OnN0ZDo6dmVjdG9yCistIFVwLCB1cCwgYW5kIGF3YXkhCistIC0xMjMKKyMgSW5zaWRlIGZsb3cgY29sbGVjdGlvbjoKKy0gWyAnOjpzdGQ6OnZlY3RvcicsCisgICJVcCwgdXAsIGFuZCBhd2F5ISIsCisgIC0xMjMgXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTEzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxYTU0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMy5jYW5vbmljYWwKQEAgLTAsMCArMSwxMSBAQAorJVlBTUwgMS4xCistLS0KKyEhbWFwIHsKKyAgPyAhIXN0ciAic2ltcGxlIGtleSIKKyAgOiAhIW1hcCB7CisgICAgPyAhIXN0ciAiYWxzbyBzaW1wbGUiCisgICAgOiAhIXN0ciAidmFsdWUiLAorICAgID8gISFzdHIgIm5vdCBhIHNpbXBsZSBrZXkiCisgICAgOiAhIXN0ciAiYW55IHZhbHVlIgorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTYzODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTMuZGF0YQpAQCAtMCwwICsxLDYgQEAKK3NpbXBsZSBrZXkgOiB7CisgIGFsc28gc2ltcGxlIDogdmFsdWUsCisgID8gbm90IGEKKyAgc2ltcGxlIGtleSA6IGFueQorICB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTE0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YyMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE0LmRhdGEKQEAgLTAsMCArMSwxNCBAQAorLS0tCistLS0gfHx8IDogZm9vCisuLi4gPj4+OiBiYXIKKy0tLQorWworLS0tCissCisuLi4gLAoreworLS0tIDoKKy4uLiAjIE5lc3RlZAorfQorXQorLi4uCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTQuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTQuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzZGI3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNC5lcnJvcgpAQCAtMCwwICsxLDYgQEAKK0VSUk9SOgorIFRoZSAtLS0gYW5kIC4uLiBkb2N1bWVudAorIHN0YXJ0IGFuZCBlbmQgbWFya2VycyBtdXN0Cisgbm90IGJlIHNwZWNpZmllZCBhcyB0aGUKKyBmaXJzdCBjb250ZW50IGxpbmUgb2YgYQorIG5vbi1pbmRlbnRlZCBwbGFpbiBzY2FsYXIuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTUuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE1LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjAyMDQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE1LmNhbm9uaWNhbApAQCAtMCwwICsxLDE4IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICItLS0iCisgIDogISFzdHIgImZvbyIsCisgID8gISFzdHIgIi4uLiIKKyAgOiAhIXN0ciAiYmFyIgorfQorJVlBTUwgMS4xCistLS0KKyEhc2VxIFsKKyAgISFzdHIgIi0tLSIsCisgICEhc3RyICIuLi4iLAorICAhIW1hcCB7CisgICAgPyAhIXN0ciAiLS0tIgorICAgIDogISFzdHIgIi4uLiIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTE1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg2M2IwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE1LmRhdGEKQEAgLTAsMCArMSwxMyBAQAorLS0tCisiLS0tIiA6IGZvbworLi4uOiBiYXIKKy0tLQorWworLS0tLAorLi4uLAoreworPyAtLS0KKzogLi4uCit9CitdCisuLi4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNi5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTYuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWJkYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTYuY2Fub25pY2FsCkBAIC0wLDAgKzEsNiBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJhcyBzcGFjZSBcCisgIHRyaW1tZWRcblwKKyAgc3BlY2lmaWNcTFxuXAorICBub25lIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTE2LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTYuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzNiZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE2LmRhdGEKQEAgLTAsMCArMSwzIEBACisjIFRhYnMgYXJlIGNvbmZ1c2luZzoKKyMgYXMgc3BhY2UvdHJpbW1lZC9zcGVjaWZpYy9ub25lCisgYXMgc3BhY2UgwoUgdHJpbW1lZCDChcKFIHNwZWNpZmlj4oCowoUgbm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTE3LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjYjcwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNy5jYW5vbmljYWwKQEAgLTAsMCArMSw0IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZpcnN0IGxpbmVcblwKKyAgICAgIG1vcmUgbGluZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYzQ2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xNy5kYXRhCkBAIC0wLDAgKzEsMyBAQAorIGZpcnN0IGxpbmUgCisgICAKKyAgbW9yZSBsaW5lCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTguY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE4LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjE0MjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE4LmNhbm9uaWNhbApAQCAtMCwwICsxLDggQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhc3RyICJsaXRlcmFsXG4iLAorICAhIXN0ciAiIGZvbGRlZFxuIiwKKyAgISFzdHIgImtlZXBcblxuIiwKKyAgISFzdHIgIiBzdHJpcCIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTguZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0xOC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzVkN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTguZGF0YQpAQCAtMCwwICsxLDkgQEAKKy0gfCAjIEp1c3QgdGhlIHN0eWxlCisgbGl0ZXJhbAorLSA+MSAjIEluZGVudGF0aW9uIGluZGljYXRvcgorICBmb2xkZWQKKy0gfCsgIyBDaG9tcGluZyBpbmRpY2F0b3IKKyBrZWVwCisKKy0gPi0xICMgQm90aCBpbmRpY2F0b3JzCisgIHN0cmlwCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMTkuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE5LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgyOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE5LmNhbm9uaWNhbApAQCAtMCwwICsxLDYgQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhc3RyICJsaXRlcmFsXG4iLAorICAhIXN0ciAiZm9sZGVkXG4iLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTE5LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMTkuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU1ODlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTE5LmRhdGEKQEAgLTAsMCArMSw0IEBACistIHwKKyBsaXRlcmFsCistID4KKyBmb2xkZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjAuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2JlZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjAuY2Fub25pY2FsCkBAIC0wLDAgKzEsOCBAQAorJVlBTUwgMS4xCistLS0KKyEhc2VxIFsKKyAgISFzdHIgImRldGVjdGVkXG4iLAorICAhIXN0ciAiXG5cbiMgZGV0ZWN0ZWRcbiIsCisgICEhc3RyICIgZXhwbGljaXRcbiIsCisgICEhc3RyICJcdFxuZGV0ZWN0ZWRcbiIsCitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjAuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmVlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjAuZGF0YQpAQCAtMCwwICsxLDExIEBACistIHwKKyBkZXRlY3RlZAorLSA+CisgCisgIAorICAjIGRldGVjdGVkCistIHwxCisgIGV4cGxpY2l0CistID4KKyAJCisgZGV0ZWN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMC5za2lwLWV4dCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMC5za2lwLWV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTIwLnNraXAtZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjEuZGF0YQpAQCAtMCwwICsxLDggQEAKKy0gfAorICAKKyB0ZXh0CistID4KKyAgdGV4dAorIHRleHQKKy0gfDEKKyB0ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjEuZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjEuZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3OWNhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMS5lcnJvcgpAQCAtMCwwICsxLDcgQEAKK0VSUk9SOgorLSBBIGxlYWRpbmcgYWxsLXNwYWNlIGxpbmUgbXVzdAorICBub3QgaGF2ZSB0b28gbWFueSBzcGFjZXMuCistIEEgZm9sbG93aW5nIHRleHQgbGluZSBtdXN0CisgIG5vdCBiZSBsZXNzIGluZGVudGVkLgorLSBUaGUgdGV4dCBpcyBsZXNzIGluZGVudGVkCisgIHRoYW4gdGhlIGluZGljYXRlZCBsZXZlbC4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMi5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjIuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjIuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTAgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgInN0cmlwIgorICA6ICEhc3RyICJ0ZXh0IiwKKyAgPyAhIXN0ciAiY2xpcCIKKyAgOiAhIXN0ciAidGV4dFxuIiwKKyAgPyAhIXN0ciAia2VlcCIKKyAgOiAhIXN0ciAidGV4dFxMIiwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTIyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNTFlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMi5kYXRhCkBAIC0wLDAgKzEsNCBAQAorc3RyaXA6IHwtCisgIHRleHTigKljbGlwOiB8CisgIHRleHTChWtlZXA6IHwrCisgIHRleHTigKgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjMuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTIzLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ0NGNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTIzLmNhbm9uaWNhbApAQCAtMCwwICsxLDEwIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJzdHJpcCIKKyAgOiAhIXN0ciAiIyB0ZXh0IiwKKyAgPyAhIXN0ciAiY2xpcCIKKyAgOiAhIXN0ciAiIyB0ZXh0XG4iLAorICA/ICEhc3RyICJrZWVwIgorICA6ICEhc3RyICIjIHRleHRcTFxuIiwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTIzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3MmQyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yMy5kYXRhCkBAIC0wLDAgKzEsMTEgQEAKKyAjIFN0cmlwCisgICMgQ29tbWVudHM6CitzdHJpcDogfC0KKyAgIyB0ZXh04oCpICDigKggIyBDbGlwCisgICMgY29tbWVudHM6CivChWNsaXA6IHwKKyAgIyB0ZXh0woUg4oCpICMgS2VlcAorICAjIGNvbW1lbnRzOgorwoVrZWVwOiB8KworICAjIHRleHTigKjChSAjIFRyYWlsCisgICMgY29tbWVudHMuCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjQuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI0LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE5OWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI0LmNhbm9uaWNhbApAQCAtMCwwICsxLDEwIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJzdHJpcCIKKyAgOiAhIXN0ciAiIiwKKyAgPyAhIXN0ciAiY2xpcCIKKyAgOiAhIXN0ciAiIiwKKyAgPyAhIXN0ciAia2VlcCIKKyAgOiAhIXN0ciAiXG4iLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTI0LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjQuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiNjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI0LmRhdGEKQEAgLTAsMCArMSw2IEBACitzdHJpcDogPi0KKworY2xpcDogPgorCitrZWVwOiB8KworCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjUuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI1LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIzMjdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI1LmNhbm9uaWNhbApAQCAtMCwwICsxLDQgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAibGl0ZXJhbFxuXAorICAgICAgXHR0ZXh0XG4iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjUuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yNS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzAzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjUuZGF0YQpAQCAtMCwwICsxLDMgQEAKK3wgIyBTaW1wbGUgYmxvY2sgc2NhbGFyCisgbGl0ZXJhbAorIAl0ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjYuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI2LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI5YTExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI2LmNhbm9uaWNhbApAQCAtMCwwICsxLDMgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiXG5cbmxpdGVyYWxcblxudGV4dFxuIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTI2LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjYuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg1NTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI2LmRhdGEKQEAgLTAsMCArMSw4IEBACit8CisgCisgIAorICBsaXRlcmFsCisgCisgIHRleHQKKworICMgQ29tbWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTI3LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yNy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyOWExMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yNy5jYW5vbmljYWwKQEAgLTAsMCArMSwzIEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgIlxuXG5saXRlcmFsXG5cbnRleHRcbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yNy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI3LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4NTU1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yNy5kYXRhCkBAIC0wLDAgKzEsOCBAQAorfAorIAorICAKKyAgbGl0ZXJhbAorIAorICB0ZXh0CisKKyAjIENvbW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yOC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjguY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjlhMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjguY2Fub25pY2FsCkBAIC0wLDAgKzEsMyBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJcblxubGl0ZXJhbFxuXG50ZXh0XG4iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjguZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yOC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODU1NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMjguZGF0YQpAQCAtMCwwICsxLDggQEAKK3wKKyAKKyAgCisgIGxpdGVyYWwKKyAKKyAgdGV4dAorCisgIyBDb21tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMjkuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI5LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTgwNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI5LmNhbm9uaWNhbApAQCAtMCwwICsxLDQgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiZm9sZGVkIHRleHRcblwKKyAgICAgIFx0bGluZXNcbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0yOS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTI5LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNjExZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0yOS5kYXRhCkBAIC0wLDAgKzEsNCBAQAorPiAjIFNpbXBsZSBmb2xkZWQgc2NhbGFyCisgZm9sZGVkCisgdGV4dAorIAlsaW5lcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTMwLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMC5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzN2RiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMC5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbGRlZCBsaW5lXG5cCisgICAgICBuZXh0IGxpbmVcblxuXAorICAgICAgXCAgKiBidWxsZXRcblwKKyAgICAgIFwgICogbGlzdFxuXG5cCisgICAgICBsYXN0IGxpbmVcbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTMwLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkOGMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMC5kYXRhCkBAIC0wLDAgKzEsMTQgQEAKKz4KKyBmb2xkZWQKKyBsaW5lCisKKyBuZXh0CisgbGluZQorCisgICAqIGJ1bGxldAorICAgKiBsaXN0CisKKyBsYXN0CisgbGluZQorCisjIENvbW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMDktMzEuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzdkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMzEuY2Fub25pY2FsCkBAIC0wLDAgKzEsNyBAQAorJVlBTUwgMS4xCistLS0KKyEhc3RyICJmb2xkZWQgbGluZVxuXAorICAgICAgbmV4dCBsaW5lXG5cblwKKyAgICAgIFwgICogYnVsbGV0XG5cCisgICAgICBcICAqIGxpc3RcblxuXAorICAgICAgbGFzdCBsaW5lXG4iCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMzEuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDhjMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMDktMzEuZGF0YQpAQCAtMCwwICsxLDE0IEBACis+CisgZm9sZGVkCisgbGluZQorCisgbmV4dAorIGxpbmUKKworICAgKiBidWxsZXQKKyAgICogbGlzdAorCisgbGFzdAorIGxpbmUKKworIyBDb21tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMDktMzIuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTMyLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM3ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTMyLmNhbm9uaWNhbApAQCAtMCwwICsxLDcgQEAKKyVZQU1MIDEuMQorLS0tCishIXN0ciAiZm9sZGVkIGxpbmVcblwKKyAgICAgIG5leHQgbGluZVxuXG5cCisgICAgICBcICAqIGJ1bGxldFxuXAorICAgICAgXCAgKiBsaXN0XG5cblwKKyAgICAgIGxhc3QgbGluZVxuIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTMyLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMDktMzIuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ4YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTMyLmRhdGEKQEAgLTAsMCArMSwxNCBAQAorPgorIGZvbGRlZAorIGxpbmUKKworIG5leHQKKyBsaW5lCisKKyAgICogYnVsbGV0CisgICAqIGxpc3QKKworIGxhc3QKKyBsaW5lCisKKyMgQ29tbWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTA5LTMzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzN2RiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMy5jYW5vbmljYWwKQEAgLTAsMCArMSw3IEBACislWUFNTCAxLjEKKy0tLQorISFzdHIgImZvbGRlZCBsaW5lXG5cCisgICAgICBuZXh0IGxpbmVcblxuXAorICAgICAgXCAgKiBidWxsZXRcblwKKyAgICAgIFwgICogbGlzdFxuXG5cCisgICAgICBsYXN0IGxpbmVcbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMy5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTA5LTMzLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkOGMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0wOS0zMy5kYXRhCkBAIC0wLDAgKzEsMTQgQEAKKz4KKyBmb2xkZWQKKyBsaW5lCisKKyBuZXh0CisgbGluZQorCisgICAqIGJ1bGxldAorICAgKiBsaXN0CisKKyBsYXN0CisgbGluZQorCisjIENvbW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDEuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGNkZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDEuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTIgQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhc2VxIFsKKyAgICAhIXN0ciAiaW5uZXIiLAorICAgICEhc3RyICJpbm5lciIsCisgIF0sCisgICEhc2VxIFsKKyAgICAhIXN0ciAiaW5uZXIiLAorICAgICEhc3RyICJsYXN0IiwKKyAgXSwKK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMS5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTAxLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2OGQzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMS5kYXRhCkBAIC0wLDAgKzEsMiBAQAorLSBbIGlubmVyLCBpbm5lciwgXQorLSBbaW5uZXIsbGFzdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMi5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDIuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmUwZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDIuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTQgQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhc3RyICJkb3VibGUgcXVvdGVkIiwKKyAgISFzdHIgInNpbmdsZSBxdW90ZWQiLAorICAhIXN0ciAicGxhaW4gdGV4dCIsCisgICEhc2VxIFsKKyAgICAhIXN0ciAibmVzdGVkIiwKKyAgXSwKKyAgISFtYXAgeworICAgID8gISFzdHIgInNpbmdsZSIKKyAgICA6ICEhc3RyICJwYWlyIgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMDIuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjMzNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDIuZGF0YQpAQCAtMCwwICsxLDggQEAKK1sKKyJkb3VibGUKKyBxdW90ZWQiLCAnc2luZ2xlCisgICAgICAgICAgIHF1b3RlZCcsCitwbGFpbgorIHRleHQsIFsgbmVzdGVkIF0sCitzaW5nbGU6IHBhaXIgLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTAzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MzM5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wMy5jYW5vbmljYWwKQEAgLTAsMCArMSwxMiBAQAorJVlBTUwgMS4xCistLS0KKyEhbWFwIHsKKyAgPyAhIXN0ciAiYmxvY2siCisgIDogISFzZXEgWworICAgICEhc3RyICJvbmUiLAorICAgICEhbWFwIHsKKyAgICAgID8gISFzdHIgInR3byIKKyAgICAgIDogISFzdHIgInRocmVlIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTAzLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDMuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTE1ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTAzLmRhdGEKQEAgLTAsMCArMSw0IEBACitibG9jazogIyBCbG9jaworICAgICAgICMgc2VxdWVuY2UKKy0gb25lCistIHR3byA6IHRocmVlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMDQuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA0LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ4NmEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA0LmNhbm9uaWNhbApAQCAtMCwwICsxLDExIEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJibG9jayIKKyAgOiAhIXNlcSBbCisgICAgISFzdHIgIm9uZSIsCisgICAgISFzZXEgWworICAgICAgISFzdHIgInR3byIKKyAgICBdCisgIF0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNWIwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNC5kYXRhCkBAIC0wLDAgKzEsNCBAQAorYmxvY2s6CistIG9uZQorLQorIC0gdHdvCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMDUuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA1LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NjMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA1LmNhbm9uaWNhbApAQCAtMCwwICsxLDE0IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIW51bGwgIiIsCisgICEhc3RyICJibG9jayBub2RlXG4iLAorICAhIXNlcSBbCisgICAgISFzdHIgIm9uZSIsCisgICAgISFzdHIgInR3byIsCisgIF0sCisgICEhbWFwIHsKKyAgICA/ICEhc3RyICJvbmUiCisgICAgOiAhIXN0ciAidHdvIiwKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTA1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTlhOTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA1LmRhdGEKQEAgLTAsMCArMSw3IEBACistICMgRW1wdHkKKy0gfAorIGJsb2NrIG5vZGUKKy0gLSBvbmUgIyBpbi1saW5lCisgIC0gdHdvICMgc2VxdWVuY2UKKy0gb25lOiB0d28gIyBpbi1saW5lCisgICAgICAgICAgICMgbWFwcGluZwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTA2LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5ODZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNi5jYW5vbmljYWwKQEAgLTAsMCArMSwxNiBAQAorJVlBTUwgMS4xCistLS0KKyEhc2VxIFsKKyAgISFtYXAgeworICAgID8gISFzdHIgImlubmVyIgorICAgIDogISFzdHIgImVudHJ5IiwKKyAgICA/ICEhc3RyICJhbHNvIgorICAgIDogISFzdHIgImlubmVyIgorICB9LAorICAhIW1hcCB7CisgICAgPyAhIXN0ciAiaW5uZXIiCisgICAgOiAhIXN0ciAiZW50cnkiLAorICAgID8gISFzdHIgImxhc3QiCisgICAgOiAhIXN0ciAiZW50cnkiCisgIH0KK10KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNi5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA2LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwYmEyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wNi5kYXRhCkBAIC0wLDAgKzEsMiBAQAorLSB7IGlubmVyIDogZW50cnkgLCBhbHNvOiBpbm5lciAsIH0KKy0ge2lubmVyOiBlbnRyeSxsYXN0IDogZW50cnl9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMDcuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA3LmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc0MjMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA3LmNhbm9uaWNhbApAQCAtMCwwICsxLDE2IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhbnVsbCAiIgorICA6ICEhc3RyICJ2YWx1ZSIsCisgID8gISFzdHIgImV4cGxpY2l0IGtleSIKKyAgOiAhIXN0ciAidmFsdWUiLAorICA/ICEhc3RyICJzaW1wbGUga2V5IgorICA6ICEhc3RyICJ2YWx1ZSIsCisgID8gISFzZXEgWworICAgICEhc3RyICJjb2xsZWN0aW9uIiwKKyAgICAhIXN0ciAic2ltcGxlIiwKKyAgICAhIXN0ciAia2V5IgorICBdCisgIDogISFzdHIgInZhbHVlIgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTA3LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDcuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk0M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA3LmRhdGEKQEAgLTAsMCArMSw3IEBACit7Cis/IDogdmFsdWUsICMgRW1wdHkga2V5Cis/IGV4cGxpY2l0Cisga2V5OiB2YWx1ZSwKK3NpbXBsZSBrZXkgOiB2YWx1ZSwKK1sgY29sbGVjdGlvbiwgc2ltcGxlLCBrZXkgXTogdmFsdWUKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0wOC5kYXRhIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA4LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViZDc4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wOC5kYXRhCkBAIC0wLDAgKzEsNSBAQAoreworbXVsdGktbGluZQorIHNpbXBsZSBrZXkgOiB2YWx1ZSwKK3ZlcnkgbG9uZyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKD4xS0IpLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBrZXk6IHZhbHVlCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMDguZXJyb3IgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDguZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3OWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wOC5lcnJvcgpAQCAtMCwwICsxLDUgQEAKK0VSUk9SOgorLSBBIHNpbXBsZSBrZXkgaXMgcmVzdHJpY3RlZAorICB0byBvbmx5IG9uZSBsaW5lLgorLSBBIHNpbXBsZSBrZXkgbXVzdCBub3QgYmUKKyAgbG9uZ2VyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTA5LmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wOS5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5ODI3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0wOS5jYW5vbmljYWwKQEAgLTAsMCArMSw4IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJrZXkiCisgIDogISFzdHIgInZhbHVlIiwKKyAgPyAhIXN0ciAiZW1wdHkiCisgIDogISFudWxsICIiLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTA5LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMDkuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDU1ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTA5LmRhdGEKQEAgLTAsMCArMSw0IEBACit7CitrZXkgOiB2YWx1ZSwKK2VtcHR5OiAjIGVtcHR5IHZhbHVl4oaTCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTAuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTEwLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZmYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTEwLmNhbm9uaWNhbApAQCAtMCwwICsxLDE2IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJleHBsaWNpdCBrZXkxIgorICA6ICEhc3RyICJleHBsaWNpdCB2YWx1ZSIsCisgID8gISFzdHIgImV4cGxpY2l0IGtleTIiCisgIDogISFudWxsICIiLAorICA/ICEhc3RyICJleHBsaWNpdCBrZXkzIgorICA6ICEhbnVsbCAiIiwKKyAgPyAhIXN0ciAic2ltcGxlIGtleTEiCisgIDogISFzdHIgImV4cGxpY2l0IHZhbHVlIiwKKyAgPyAhIXN0ciAic2ltcGxlIGtleTIiCisgIDogISFudWxsICIiLAorICA/ICEhc3RyICJzaW1wbGUga2V5MyIKKyAgOiAhIW51bGwgIiIsCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTAuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODhiMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTAuZGF0YQpAQCAtMCwwICsxLDggQEAKK3sKKz8gZXhwbGljaXQga2V5MSA6IGV4cGxpY2l0IHZhbHVlLAorPyBleHBsaWNpdCBrZXkyIDogLCAjIEV4cGxpY2l0IGVtcHR5Cis/IGV4cGxpY2l0IGtleTMsICAgICAjIEVtcHR5IHZhbHVlCitzaW1wbGUga2V5MSA6IGV4cGxpY2l0IHZhbHVlLAorc2ltcGxlIGtleTIgOiAsICAgICAjIEV4cGxpY2l0IGVtcHR5CitzaW1wbGUga2V5MywgICAgICAgICAjIEVtcHR5IHZhbHVlCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTEuY2Fub25pY2FsIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTExLmNhbm9uaWNhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTExLmNhbm9uaWNhbApAQCAtMCwwICsxLDI0IEBACislWUFNTCAxLjEKKy0tLQorISFzZXEgWworICAhIW1hcCB7CisgICAgPyAhIXN0ciAiZXhwbGljaXQga2V5MSIKKyAgICA6ICEhc3RyICJleHBsaWNpdCB2YWx1ZSIsCisgIH0sCisgICEhbWFwIHsKKyAgICA/ICEhc3RyICJleHBsaWNpdCBrZXkyIgorICAgIDogISFudWxsICIiLAorICB9LAorICAhIW1hcCB7CisgICAgPyAhIXN0ciAiZXhwbGljaXQga2V5MyIKKyAgICA6ICEhbnVsbCAiIiwKKyAgfSwKKyAgISFtYXAgeworICAgID8gISFzdHIgInNpbXBsZSBrZXkxIgorICAgIDogISFzdHIgImV4cGxpY2l0IHZhbHVlIiwKKyAgfSwKKyAgISFtYXAgeworICAgID8gISFzdHIgInNpbXBsZSBrZXkyIgorICAgIDogISFudWxsICIiLAorICB9LAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTExLmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTEuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA1NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTExLmRhdGEKQEAgLTAsMCArMSw3IEBACitbCis/IGV4cGxpY2l0IGtleTEgOiBleHBsaWNpdCB2YWx1ZSwKKz8gZXhwbGljaXQga2V5MiA6ICwgIyBFeHBsaWNpdCBlbXB0eQorPyBleHBsaWNpdCBrZXkzLCAgICAgIyBJbXBsaWNpdCBlbXB0eQorc2ltcGxlIGtleTEgOiBleHBsaWNpdCB2YWx1ZSwKK3NpbXBsZSBrZXkyIDogLCAgICAgIyBFeHBsaWNpdCBlbXB0eQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTEyLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMi5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1ZGQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMi5jYW5vbmljYWwKQEAgLTAsMCArMSw5IEBACislWUFNTCAxLjEKKy0tLQorISFtYXAgeworICA/ICEhc3RyICJibG9jayIKKyAgOiAhIW1hcCB7CisgICAgPyAhIXN0ciAia2V5IgorICAgIDogISFzdHIgInZhbHVlIgorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTIuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMi5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjE0NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTIuZGF0YQpAQCAtMCwwICsxLDMgQEAKK2Jsb2NrOiAjIEJsb2NrCisgICAgIyBtYXBwaW5nCisga2V5OiB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTEzLmNhbm9uaWNhbCBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMy5jYW5vbmljYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4M2M1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMy5jYW5vbmljYWwKQEAgLTAsMCArMSwxMSBAQAorJVlBTUwgMS4xCistLS0KKyEhbWFwIHsKKyAgPyAhIXN0ciAiZXhwbGljaXQga2V5IgorICA6ICEhbnVsbCAiIiwKKyAgPyAhIXN0ciAiYmxvY2sga2V5XG4iCisgIDogISFzZXEgWworICAgICEhc3RyICJvbmUiLAorICAgICEhc3RyICJ0d28iLAorICBdCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTMuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xMy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yjk3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTMuZGF0YQpAQCAtMCwwICsxLDUgQEAKKz8gZXhwbGljaXQga2V5ICMgaW1wbGljaXQgdmFsdWUKKz8gfAorICBibG9jayBrZXkKKzogLSBvbmUgIyBleHBsaWNpdCBpbi1saW5lCisgIC0gdHdvICMgYmxvY2sgdmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0xNC5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTQuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4N2M4ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTQuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTEgQEAKKyVZQU1MIDEuMQorLS0tCishIW1hcCB7CisgID8gISFzdHIgInBsYWluIGtleSIKKyAgOiAhIW51bGwgIiIsCisgID8gISFzdHIgInF1b3RlZCBrZXkiCisgIDogISFzZXEgWworICAgICEhc3RyICJvbmUiLAorICAgICEhc3RyICJ0d28iLAorICBdCit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3NwZWMtMTAtMTQuZGF0YSBiL3Rlc3RzL2RhdGEvc3BlYy0xMC0xNC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTk5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTQuZGF0YQpAQCAtMCwwICsxLDQgQEAKK3BsYWluIGtleTogIyBlbXB0eSB2YWx1ZQorInF1b3RlZCBrZXkiOgorLSBvbmUgIyBleHBsaWNpdCBuZXh0LWxpbmUKKy0gdHdvICMgYmxvY2sgdmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3BlYy0xMC0xNS5jYW5vbmljYWwgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTUuY2Fub25pY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmJiZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTUuY2Fub25pY2FsCkBAIC0wLDAgKzEsMTggQEAKKyVZQU1MIDEuMQorLS0tCishIXNlcSBbCisgICEhbWFwIHsKKyAgICA/ICEhc3RyICJzdW4iCisgICAgOiAhIXN0ciAieWVsbG93IgorICB9LAorICAhIW1hcCB7CisgICAgPyAhIW1hcCB7CisgICAgICA/ICEhc3RyICJlYXJ0aCIKKyAgICAgIDogISFzdHIgImJsdWUiCisgICAgfQorICAgIDogISFtYXAgeworICAgICAgPyAhIXN0ciAibW9vbiIKKyAgICAgIDogISFzdHIgIndoaXRlIgorICAgIH0KKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zcGVjLTEwLTE1LmRhdGEgYi90ZXN0cy9kYXRhL3NwZWMtMTAtMTUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjc1Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zcGVjLTEwLTE1LmRhdGEKQEAgLTAsMCArMSwzIEBACistIHN1bjogeWVsbG93CistID8gZWFydGg6IGJsdWUKKyAgOiBtb29uOiB3aGl0ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS9zdHIuZGF0YSBiL3Rlc3RzL2RhdGEvc3RyLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiZGI3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3RyLmRhdGEKQEAgLTAsMCArMSBAQAorLSBhYmNkCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3N0ci5kZXRlY3QgYi90ZXN0cy9kYXRhL3N0ci5kZXRlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1MDI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvc3RyLmRldGVjdApAQCAtMCwwICsxIEBACit0YWc6eWFtbC5vcmcsMjAwMjpzdHIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdGFncy5ldmVudHMgYi90ZXN0cy9kYXRhL3RhZ3MuZXZlbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTNkY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3RhZ3MuZXZlbnRzCkBAIC0wLDAgKzEsMTIgQEAKKy0gIVN0cmVhbVN0YXJ0CistICFEb2N1bWVudFN0YXJ0CistICFTZXF1ZW5jZVN0YXJ0CistICFTY2FsYXIgeyB2YWx1ZTogJ2RhdGEnIH0KKyMtICFTY2FsYXIgeyB0YWc6ICchJywgdmFsdWU6ICdkYXRhJyB9CistICFTY2FsYXIgeyB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLCB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNjYWxhciB7IHRhZzogJyFteWZ1bm55dGFnJywgdmFsdWU6ICdkYXRhJyB9CistICFTY2FsYXIgeyB0YWc6ICchbXkhdWdseSF0YWcnLCB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNjYWxhciB7IHRhZzogJ3RhZzpteS5kb21haW4ub3JnLDIwMDI6ZGF0YSE/ICMnLCB2YWx1ZTogJ2RhdGEnIH0KKy0gIVNlcXVlbmNlRW5kCistICFEb2N1bWVudEVuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3Rlc3RfbWFyay5tYXJrcyBiL3Rlc3RzL2RhdGEvdGVzdF9tYXJrLm1hcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDhlZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3Rlc3RfbWFyay5tYXJrcwpAQCAtMCwwICsxLDM4IEBACistLS0KKypUaGUgZmlyc3QgbGluZS4KK1RoZSBsYXN0IGxpbmUuCistLS0KK1RoZSBmaXJzdCpsaW5lLgorVGhlIGxhc3QgbGluZS4KKy0tLQorVGhlIGZpcnN0IGxpbmUuKgorVGhlIGxhc3QgbGluZS4KKy0tLQorVGhlIGZpcnN0IGxpbmUuCisqVGhlIGxhc3QgbGluZS4KKy0tLQorVGhlIGZpcnN0IGxpbmUuCitUaGUgbGFzdCpsaW5lLgorLS0tCitUaGUgZmlyc3QgbGluZS4KK1RoZSBsYXN0IGxpbmUuKgorLS0tCitUaGUgZmlyc3QgbGluZS4KKypUaGUgc2VsZWN0ZWQgbGluZS4KK1RoZSBsYXN0IGxpbmUuCistLS0KK1RoZSBmaXJzdCBsaW5lLgorVGhlIHNlbGVjdGVkKmxpbmUuCitUaGUgbGFzdCBsaW5lLgorLS0tCitUaGUgZmlyc3QgbGluZS4KK1RoZSBzZWxlY3RlZCBsaW5lLioKK1RoZSBsYXN0IGxpbmUuCistLS0KKypUaGUgb25seSBsaW5lLgorLS0tCitUaGUgb25seSpsaW5lLgorLS0tCitUaGUgb25seSBsaW5lLioKKy0tLQorTG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZypMaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWluZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS90aW1lc3RhbXAtYnVncy5jb2RlIGIvdGVzdHMvZGF0YS90aW1lc3RhbXAtYnVncy5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZDZlOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3RpbWVzdGFtcC1idWdzLmNvZGUKQEAgLTAsMCArMSw4IEBACitbCisgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDE1LCAzLCAyOSwgNDMsIDEwMDAwMCksCisgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDE0LCAxNiwgMjksIDQzLCAxMDAwMDApLAorICAgIGRhdGV0aW1lLmRhdGV0aW1lKDIwMDEsIDEyLCAxNCwgMjEsIDU5LCA0MywgMTAxMCksCisgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMSwgMTIsIDE0LCAyMSwgNTksIDQzLCAwLCBGaXhlZE9mZnNldCg2MCwgIisxIikpLAorICAgIGRhdGV0aW1lLmRhdGV0aW1lKDIwMDEsIDEyLCAxNCwgMjEsIDU5LCA0MywgMCwgRml4ZWRPZmZzZXQoLTkwLCAiLTE6MzAiKSksCisgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwNSwgNywgOCwgMTcsIDM1LCA0LCA1MTc2MDApLAorXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS90aW1lc3RhbXAtYnVncy5kYXRhIGIvdGVzdHMvZGF0YS90aW1lc3RhbXAtYnVncy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMWQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3RpbWVzdGFtcC1idWdzLmRhdGEKQEAgLTAsMCArMSw2IEBACistIDIwMDEtMTItMTQgMjE6NTk6NDMuMTAgLTU6MzAKKy0gMjAwMS0xMi0xNCAyMTo1OTo0My4xMCArNTozMAorLSAyMDAxLTEyLTE0IDIxOjU5OjQzLjAwMTAxCistIDIwMDEtMTItMTQgMjE6NTk6NDMrMQorLSAyMDAxLTEyLTE0IDIxOjU5OjQzLTE6MzAKKy0gMjAwNS0wNy0wOCAxNzozNTowNC41MTc2MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdGltZXN0YW1wLmRhdGEgYi90ZXN0cy9kYXRhL3RpbWVzdGFtcC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjE0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3RpbWVzdGFtcC5kYXRhCkBAIC0wLDAgKzEsNSBAQAorLSAyMDAxLTEyLTE1VDAyOjU5OjQzLjFaCistIDIwMDEtMTItMTR0MjE6NTk6NDMuMTAtMDU6MDAKKy0gMjAwMS0xMi0xNCAyMTo1OTo0My4xMCAtNQorLSAyMDAxLTEyLTE1IDI6NTk6NDMuMTAKKy0gMjAwMi0xMi0xNApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS90aW1lc3RhbXAuZGV0ZWN0IGIvdGVzdHMvZGF0YS90aW1lc3RhbXAuZGV0ZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3RpbWVzdGFtcC5kZXRlY3QKQEAgLTAsMCArMSBAQAordGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3VuYWNjZXB0YWJsZS1rZXkubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS91bmFjY2VwdGFibGUta2V5LmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQ4ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91bmFjY2VwdGFibGUta2V5LmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDQgQEAKKy0tLQorPyAtIGZvbworICAtIGJhcgorOiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdW5jbG9zZWQtYnJhY2tldC5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL3VuY2xvc2VkLWJyYWNrZXQubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODIwNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3VuY2xvc2VkLWJyYWNrZXQubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsNiBAQAordGVzdDoKKyAgICAtIFsgZm9vOiBiYXIKKyMgY29tbWVudCB0aGUgcmVzdCBvZiB0aGUgc3RyZWFtIHRvIGxldCB0aGUgc2Nhbm5lciBkZXRlY3QgdGhlIHByb2JsZW0uCisjICAgIC0gYmF6CisjIndlIGNvdWxkIGhhdmUgZGV0ZWN0ZWQgdGhlIHVuY2xvc2VkIGJyYWNrZXQgb24gdGhlIGFib3ZlIGxpbmUsIGJ1dCB0aGlzIHdvdWxkIGZvcmJpZCBzdWNoIHN5bnRheCBhcyI6IHsKKyN9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3VuY2xvc2VkLXF1b3RlZC1zY2FsYXIubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS91bmNsb3NlZC1xdW90ZWQtc2NhbGFyLmxvYWRlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM3NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91bmNsb3NlZC1xdW90ZWQtc2NhbGFyLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxLDIgQEAKKydmb28KKyBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdW5kZWZpbmVkLWFuY2hvci5sb2FkZXItZXJyb3IgYi90ZXN0cy9kYXRhL3VuZGVmaW5lZC1hbmNob3IubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjkxMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3VuZGVmaW5lZC1hbmNob3IubG9hZGVyLWVycm9yCkBAIC0wLDAgKzEsMyBAQAorLSBmb28KKy0gJmJhciBiYXoKKy0gKmJhdApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS91bmRlZmluZWQtY29uc3RydWN0b3IubG9hZGVyLWVycm9yIGIvdGVzdHMvZGF0YS91bmRlZmluZWQtY29uc3RydWN0b3IubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzdjY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3VuZGVmaW5lZC1jb25zdHJ1Y3Rvci5sb2FkZXItZXJyb3IKQEAgLTAsMCArMSBAQAorLS0tICFmb28gYmFyCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3VuZGVmaW5lZC10YWctaGFuZGxlLmxvYWRlci1lcnJvciBiL3Rlc3RzL2RhdGEvdW5kZWZpbmVkLXRhZy1oYW5kbGUubG9hZGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmEzMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3VuZGVmaW5lZC10YWctaGFuZGxlLmxvYWRlci1lcnJvcgpAQCAtMCwwICsxIEBACistLS0gIWZvbyFiYXIgICAgYmF6CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3Vua25vd24uZHVtcGVyLWVycm9yIGIvdGVzdHMvZGF0YS91bmtub3duLmR1bXBlci1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzIwNGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91bmtub3duLmR1bXBlci1lcnJvcgpAQCAtMCwwICsxIEBACit5YW1sLnNhZmVfZHVtcChvYmplY3QpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3Vuc3VwcG9ydGVkLXZlcnNpb24uZW1pdHRlci1lcnJvciBiL3Rlc3RzL2RhdGEvdW5zdXBwb3J0ZWQtdmVyc2lvbi5lbWl0dGVyLWVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzYxOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3Vuc3VwcG9ydGVkLXZlcnNpb24uZW1pdHRlci1lcnJvcgpAQCAtMCwwICsxLDUgQEAKKy0gIVN0cmVhbVN0YXJ0CistICFEb2N1bWVudFN0YXJ0IHsgdmVyc2lvbjogWzUsNl0gfQorLSAhU2NhbGFyIHsgdmFsdWU6IGZvbyB9CistICFEb2N1bWVudEVuZAorLSAhU3RyZWFtRW5kCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3V0ZjE2YmUuY29kZSBiL3Rlc3RzL2RhdGEvdXRmMTZiZS5jb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWIzNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3V0ZjE2YmUuY29kZQpAQCAtMCwwICsxIEBACisiVVRGLTE2LUJFIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS91dGYxNmJlLmRhdGEgYi90ZXN0cy9kYXRhL3V0ZjE2YmUuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRjZmFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91dGYxNmJlLmRhdGEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS91dGYxNmxlLmNvZGUgYi90ZXN0cy9kYXRhL3V0ZjE2bGUuY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA1MzBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91dGYxNmxlLmNvZGUKQEAgLTAsMCArMSBAQAorIlVURi0xNi1MRSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdXRmMTZsZS5kYXRhIGIvdGVzdHMvZGF0YS91dGYxNmxlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNWU3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvdXRmMTZsZS5kYXRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdXRmOC1pbXBsaWNpdC5jb2RlIGIvdGVzdHMvZGF0YS91dGY4LWltcGxpY2l0LmNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvdXRmOC1pbXBsaWNpdC5jb2RlCkBAIC0wLDAgKzEgQEAKKyJpbXBsaWNpdCBVVEYtOCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdXRmOC1pbXBsaWNpdC5kYXRhIGIvdGVzdHMvZGF0YS91dGY4LWltcGxpY2l0LmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MDgxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvdXRmOC1pbXBsaWNpdC5kYXRhCkBAIC0wLDAgKzEgQEAKKy0tLSBpbXBsaWNpdCBVVEYtOApkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS91dGY4LmNvZGUgYi90ZXN0cy9kYXRhL3V0ZjguY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YxMWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91dGY4LmNvZGUKQEAgLTAsMCArMSBAQAorIlVURi04IgpkaWZmIC0tZ2l0IGEvdGVzdHMvZGF0YS91dGY4LmRhdGEgYi90ZXN0cy9kYXRhL3V0ZjguZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODZmNDhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS91dGY4LmRhdGEKQEAgLTAsMCArMSBAQAor77u/LS0tIFVURi04CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3ZhbHVlLmRhdGEgYi90ZXN0cy9kYXRhL3ZhbHVlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNzY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvdmFsdWUuZGF0YQpAQCAtMCwwICsxIEBACistID0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvdmFsdWUuZGV0ZWN0IGIvdGVzdHMvZGF0YS92YWx1ZS5kZXRlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzN2QwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvdmFsdWUuZGV0ZWN0CkBAIC0wLDAgKzEgQEAKK3RhZzp5YW1sLm9yZywyMDAyOnZhbHVlCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3lhbWwuZGF0YSBiL3Rlc3RzL2RhdGEveWFtbC5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmIzZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3lhbWwuZGF0YQpAQCAtMCwwICsxLDMgQEAKKy0gISF5YW1sICchJworLSAhIXlhbWwgJyYnCistICEheWFtbCAnKicKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEveWFtbC5kZXRlY3QgYi90ZXN0cy9kYXRhL3lhbWwuZGV0ZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2YxODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL3lhbWwuZGV0ZWN0CkBAIC0wLDAgKzEgQEAKK3RhZzp5YW1sLm9yZywyMDAyOnlhbWwKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9jYW5vbmljYWwucHkgYi90ZXN0cy9saWIvY2Fub25pY2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGU2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvY2Fub25pY2FsLnB5CkBAIC0wLDAgKzEsMzYwIEBACisKK2ltcG9ydCB5YW1sLCB5YW1sLmNvbXBvc2VyLCB5YW1sLmNvbnN0cnVjdG9yLCB5YW1sLnJlc29sdmVyCisKK2NsYXNzIENhbm9uaWNhbEVycm9yKHlhbWwuWUFNTEVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIENhbm9uaWNhbFNjYW5uZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHVuaWNvZGUoZGF0YSwgJ3V0Zi04JykrdSdcMCcKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIENhbm9uaWNhbEVycm9yKCJ1dGYtOCBzdHJlYW0gaXMgZXhwZWN0ZWQiKQorICAgICAgICBzZWxmLmluZGV4ID0gMAorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisgICAgICAgIHNlbGYuc2Nhbm5lZCA9IEZhbHNlCisKKyAgICBkZWYgY2hlY2tfdG9rZW4oc2VsZiwgKmNob2ljZXMpOgorICAgICAgICBpZiBub3Qgc2VsZi5zY2FubmVkOgorICAgICAgICAgICAgc2VsZi5zY2FuKCkKKyAgICAgICAgaWYgc2VsZi50b2tlbnM6CisgICAgICAgICAgICBpZiBub3QgY2hvaWNlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZm9yIGNob2ljZSBpbiBjaG9pY2VzOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi50b2tlbnNbMF0sIGNob2ljZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHBlZWtfdG9rZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNjYW5uZWQ6CisgICAgICAgICAgICBzZWxmLnNjYW4oKQorICAgICAgICBpZiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2Vuc1swXQorCisgICAgZGVmIGdldF90b2tlbihzZWxmLCBjaG9pY2U9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNjYW5uZWQ6CisgICAgICAgICAgICBzZWxmLnNjYW4oKQorICAgICAgICB0b2tlbiA9IHNlbGYudG9rZW5zLnBvcCgwKQorICAgICAgICBpZiBjaG9pY2UgYW5kIG5vdCBpc2luc3RhbmNlKHRva2VuLCBjaG9pY2UpOgorICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoInVuZXhwZWN0ZWQgdG9rZW4gIityZXByKHRva2VuKSkKKyAgICAgICAgcmV0dXJuIHRva2VuCisKKyAgICBkZWYgZ2V0X3Rva2VuX3ZhbHVlKHNlbGYpOgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlCisKKyAgICBkZWYgc2NhbihzZWxmKToKKyAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuU3RyZWFtU3RhcnRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuZmluZF90b2tlbigpCisgICAgICAgICAgICBjaCA9IHNlbGYuZGF0YVtzZWxmLmluZGV4XQorICAgICAgICAgICAgaWYgY2ggPT0gdSdcMCc6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuU3RyZWFtRW5kVG9rZW4oTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gdSclJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2RpcmVjdGl2ZSgpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSB1Jy0nIGFuZCBzZWxmLmRhdGFbc2VsZi5pbmRleDpzZWxmLmluZGV4KzNdID09IHUnLS0tJzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDMKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoeWFtbC5Eb2N1bWVudFN0YXJ0VG9rZW4oTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBlbGlmIGNoID09IHUnWyc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRmxvd1NlcXVlbmNlU3RhcnRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gdSd7JzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoeWFtbC5GbG93TWFwcGluZ1N0YXJ0VG9rZW4oTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBlbGlmIGNoID09IHUnXSc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRmxvd1NlcXVlbmNlRW5kVG9rZW4oTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBlbGlmIGNoID09IHUnfSc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRmxvd01hcHBpbmdFbmRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gdSc/JzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoeWFtbC5LZXlUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gdSc6JzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoeWFtbC5WYWx1ZVRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSB1JywnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLkZsb3dFbnRyeVRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSB1JyonIG9yIGNoID09IHUnJic6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9hbGlhcygpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSB1JyEnOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fdGFnKCkpCisgICAgICAgICAgICBlbGlmIGNoID09IHUnIic6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHNlbGYuc2Nhbl9zY2FsYXIoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoImludmFsaWQgdG9rZW4iKQorICAgICAgICBzZWxmLnNjYW5uZWQgPSBUcnVlCisKKyAgICBESVJFQ1RJVkUgPSB1JyVZQU1MIDEuMScKKworICAgIGRlZiBzY2FuX2RpcmVjdGl2ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXg6c2VsZi5pbmRleCtsZW4oc2VsZi5ESVJFQ1RJVkUpXSA9PSBzZWxmLkRJUkVDVElWRSBhbmQgXAorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVtzZWxmLmluZGV4K2xlbihzZWxmLkRJUkVDVElWRSldIGluIHUnIFxuXDAnOgorICAgICAgICAgICAgc2VsZi5pbmRleCArPSBsZW4oc2VsZi5ESVJFQ1RJVkUpCisgICAgICAgICAgICByZXR1cm4geWFtbC5EaXJlY3RpdmVUb2tlbignWUFNTCcsICgxLCAxKSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIENhbm9uaWNhbEVycm9yKCJpbnZhbGlkIGRpcmVjdGl2ZSIpCisKKyAgICBkZWYgc2Nhbl9hbGlhcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXhdID09IHUnKic6CisgICAgICAgICAgICBUb2tlbkNsYXNzID0geWFtbC5BbGlhc1Rva2VuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBUb2tlbkNsYXNzID0geWFtbC5BbmNob3JUb2tlbgorICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgc3RhcnQgPSBzZWxmLmluZGV4CisgICAgICAgIHdoaWxlIHNlbGYuZGF0YVtzZWxmLmluZGV4XSBub3QgaW4gdScsIFxuXDAnOgorICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgIHZhbHVlID0gc2VsZi5kYXRhW3N0YXJ0OnNlbGYuaW5kZXhdCisgICAgICAgIHJldHVybiBUb2tlbkNsYXNzKHZhbHVlLCBOb25lLCBOb25lKQorCisgICAgZGVmIHNjYW5fdGFnKHNlbGYpOgorICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgc3RhcnQgPSBzZWxmLmluZGV4CisgICAgICAgIHdoaWxlIHNlbGYuZGF0YVtzZWxmLmluZGV4XSBub3QgaW4gdScgXG5cMCc6CisgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgdmFsdWUgPSBzZWxmLmRhdGFbc3RhcnQ6c2VsZi5pbmRleF0KKyAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgdmFsdWUgPSB1JyEnCisgICAgICAgIGVsaWYgdmFsdWVbMF0gPT0gdSchJzoKKyAgICAgICAgICAgIHZhbHVlID0gJ3RhZzp5YW1sLm9yZywyMDAyOicrdmFsdWVbMTpdCisgICAgICAgIGVsaWYgdmFsdWVbMF0gPT0gdSc8JyBhbmQgdmFsdWVbLTFdID09IHUnPic6CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IHUnIScrdmFsdWUKKyAgICAgICAgcmV0dXJuIHlhbWwuVGFnVG9rZW4odmFsdWUsIE5vbmUsIE5vbmUpCisKKyAgICBRVU9URV9DT0RFUyA9IHsKKyAgICAgICAgJ3gnOiAyLAorICAgICAgICAndSc6IDQsCisgICAgICAgICdVJzogOCwKKyAgICB9CisKKyAgICBRVU9URV9SRVBMQUNFUyA9IHsKKyAgICAgICAgdSdcXCc6IHUnXFwnLAorICAgICAgICB1J1wiJzogdSdcIicsCisgICAgICAgIHUnICc6IHUnICcsCisgICAgICAgIHUnYSc6IHUnXHgwNycsCisgICAgICAgIHUnYic6IHUnXHgwOCcsCisgICAgICAgIHUnZSc6IHUnXHgxQicsCisgICAgICAgIHUnZic6IHUnXHgwQycsCisgICAgICAgIHUnbic6IHUnXHgwQScsCisgICAgICAgIHUncic6IHUnXHgwRCcsCisgICAgICAgIHUndCc6IHUnXHgwOScsCisgICAgICAgIHUndic6IHUnXHgwQicsCisgICAgICAgIHUnTic6IHUnXHUwMDg1JywKKyAgICAgICAgdSdMJzogdSdcdTIwMjgnLAorICAgICAgICB1J1AnOiB1J1x1MjAyOScsCisgICAgICAgIHUnXyc6IHUnXycsCisgICAgICAgIHUnMCc6IHUnXHgwMCcsCisKKyAgICB9CisKKyAgICBkZWYgc2Nhbl9zY2FsYXIoc2VsZik6CisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBzdGFydCA9IHNlbGYuaW5kZXgKKyAgICAgICAgaWdub3JlX3NwYWNlcyA9IEZhbHNlCisgICAgICAgIHdoaWxlIHNlbGYuZGF0YVtzZWxmLmluZGV4XSAhPSB1JyInOgorICAgICAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXhdID09IHUnXFwnOgorICAgICAgICAgICAgICAgIGlnbm9yZV9zcGFjZXMgPSBGYWxzZQorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VsZi5kYXRhW3N0YXJ0OnNlbGYuaW5kZXhdKQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIGNoID0gc2VsZi5kYXRhW3NlbGYuaW5kZXhdCisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgaWYgY2ggPT0gdSdcbic6CisgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zcGFjZXMgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBjaCBpbiBzZWxmLlFVT1RFX0NPREVTOgorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLlFVT1RFX0NPREVTW2NoXQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gaW50KHNlbGYuZGF0YVtzZWxmLmluZGV4OnNlbGYuaW5kZXgrbGVuZ3RoXSwgMTYpCisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQodW5pY2hyKGNvZGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IGxlbmd0aAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoIG5vdCBpbiBzZWxmLlFVT1RFX1JFUExBQ0VTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoImludmFsaWQgZXNjYXBlIGNvZGUiKQorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuUVVPVEVfUkVQTEFDRVNbY2hdKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICAgICAgZWxpZiBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gdSdcbic6CisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLmRhdGFbc3RhcnQ6c2VsZi5pbmRleF0pCisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCh1JyAnKQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICAgICAgICAgIGlnbm9yZV9zcGFjZXMgPSBUcnVlCisgICAgICAgICAgICBlbGlmIGlnbm9yZV9zcGFjZXMgYW5kIHNlbGYuZGF0YVtzZWxmLmluZGV4XSA9PSB1JyAnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZ25vcmVfc3BhY2VzID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLmRhdGFbc3RhcnQ6c2VsZi5pbmRleF0pCisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICByZXR1cm4geWFtbC5TY2FsYXJUb2tlbih1Jycuam9pbihjaHVua3MpLCBGYWxzZSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBmaW5kX3Rva2VuKHNlbGYpOgorICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBmb3VuZDoKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuZGF0YVtzZWxmLmluZGV4XSBpbiB1JyBcdCc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gdScjJzoKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLmRhdGFbc2VsZi5pbmRleF0gIT0gdSdcbic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXhdID09IHUnXG4nOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKworY2xhc3MgQ2Fub25pY2FsUGFyc2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisgICAgICAgIHNlbGYucGFyc2VkID0gRmFsc2UKKworICAgIGRlZiBkaXNwb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICAjIHN0cmVhbTogU1RSRUFNLVNUQVJUIGRvY3VtZW50KiBTVFJFQU0tRU5ECisgICAgZGVmIHBhcnNlX3N0cmVhbShzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5TdHJlYW1TdGFydFRva2VuKQorICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5TdHJlYW1TdGFydEV2ZW50KE5vbmUsIE5vbmUpKQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5jaGVja190b2tlbih5YW1sLlN0cmVhbUVuZFRva2VuKToKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5EaXJlY3RpdmVUb2tlbiwgeWFtbC5Eb2N1bWVudFN0YXJ0VG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VfZG9jdW1lbnQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBDYW5vbmljYWxFcnJvcigiZG9jdW1lbnQgaXMgZXhwZWN0ZWQsIGdvdCAiK3JlcHIoc2VsZi50b2tlbnNbMF0pKQorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLlN0cmVhbUVuZFRva2VuKQorICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5TdHJlYW1FbmRFdmVudChOb25lLCBOb25lKSkKKworICAgICMgZG9jdW1lbnQ6IERJUkVDVElWRT8gRE9DVU1FTlQtU1RBUlQgbm9kZQorICAgIGRlZiBwYXJzZV9kb2N1bWVudChzZWxmKToKKyAgICAgICAgbm9kZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbih5YW1sLkRpcmVjdGl2ZVRva2VuKToKKyAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRGlyZWN0aXZlVG9rZW4pCisgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRG9jdW1lbnRTdGFydFRva2VuKQorICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5Eb2N1bWVudFN0YXJ0RXZlbnQoTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYucGFyc2Vfbm9kZSgpCisgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCh5YW1sLkRvY3VtZW50RW5kRXZlbnQoTm9uZSwgTm9uZSkpCisKKyAgICAjIG5vZGU6IEFMSUFTIHwgQU5DSE9SPyBUQUc/IChTQ0FMQVJ8c2VxdWVuY2V8bWFwcGluZykKKyAgICBkZWYgcGFyc2Vfbm9kZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbih5YW1sLkFsaWFzVG9rZW4pOgorICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuQWxpYXNFdmVudChzZWxmLmdldF90b2tlbl92YWx1ZSgpLCBOb25lLCBOb25lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFuY2hvciA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5BbmNob3JUb2tlbik6CisgICAgICAgICAgICAgICAgYW5jaG9yID0gc2VsZi5nZXRfdG9rZW5fdmFsdWUoKQorICAgICAgICAgICAgdGFnID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbih5YW1sLlRhZ1Rva2VuKToKKyAgICAgICAgICAgICAgICB0YWcgPSBzZWxmLmdldF90b2tlbl92YWx1ZSgpCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuU2NhbGFyVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCh5YW1sLlNjYWxhckV2ZW50KGFuY2hvciwgdGFnLCAoRmFsc2UsIEZhbHNlKSwgc2VsZi5nZXRfdG9rZW5fdmFsdWUoKSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBlbGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93U2VxdWVuY2VTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5TZXF1ZW5jZVN0YXJ0RXZlbnQoYW5jaG9yLCB0YWcsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIHNlbGYucGFyc2Vfc2VxdWVuY2UoKQorICAgICAgICAgICAgZWxpZiBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd01hcHBpbmdTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5NYXBwaW5nU3RhcnRFdmVudChhbmNob3IsIHRhZywgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV9tYXBwaW5nKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoIlNDQUxBUiwgJ1snLCBvciAneycgaXMgZXhwZWN0ZWQsIGdvdCAiK3JlcHIoc2VsZi50b2tlbnNbMF0pKQorCisgICAgIyBzZXF1ZW5jZTogU0VRVUVOQ0UtU1RBUlQgKG5vZGUgKEVOVFJZIG5vZGUpKik/IEVOVFJZPyBTRVFVRU5DRS1FTkQKKyAgICBkZWYgcGFyc2Vfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRmxvd1NlcXVlbmNlU3RhcnRUb2tlbikKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93U2VxdWVuY2VFbmRUb2tlbik6CisgICAgICAgICAgICBzZWxmLnBhcnNlX25vZGUoKQorICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93U2VxdWVuY2VFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5GbG93RW50cnlUb2tlbikKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbih5YW1sLkZsb3dTZXF1ZW5jZUVuZFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV9ub2RlKCkKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5GbG93U2VxdWVuY2VFbmRUb2tlbikKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuU2VxdWVuY2VFbmRFdmVudChOb25lLCBOb25lKSkKKworICAgICMgbWFwcGluZzogTUFQUElORy1TVEFSVCAobWFwX2VudHJ5IChFTlRSWSBtYXBfZW50cnkpKik/IEVOVFJZPyBNQVBQSU5HLUVORAorICAgIGRlZiBwYXJzZV9tYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLkZsb3dNYXBwaW5nU3RhcnRUb2tlbikKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93TWFwcGluZ0VuZFRva2VuKToKKyAgICAgICAgICAgIHNlbGYucGFyc2VfbWFwX2VudHJ5KCkKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd01hcHBpbmdFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5GbG93RW50cnlUb2tlbikKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja190b2tlbih5YW1sLkZsb3dNYXBwaW5nRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlX21hcF9lbnRyeSgpCisgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRmxvd01hcHBpbmdFbmRUb2tlbikKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuTWFwcGluZ0VuZEV2ZW50KE5vbmUsIE5vbmUpKQorCisgICAgIyBtYXBfZW50cnk6IEtFWSBub2RlIFZBTFVFIG5vZGUKKyAgICBkZWYgcGFyc2VfbWFwX2VudHJ5KHNlbGYpOgorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLktleVRva2VuKQorICAgICAgICBzZWxmLnBhcnNlX25vZGUoKQorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLlZhbHVlVG9rZW4pCisgICAgICAgIHNlbGYucGFyc2Vfbm9kZSgpCisKKyAgICBkZWYgcGFyc2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2Vfc3RyZWFtKCkKKyAgICAgICAgc2VsZi5wYXJzZWQgPSBUcnVlCisKKyAgICBkZWYgZ2V0X2V2ZW50KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZWQ6CisgICAgICAgICAgICBzZWxmLnBhcnNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnRzLnBvcCgwKQorCisgICAgZGVmIGNoZWNrX2V2ZW50KHNlbGYsICpjaG9pY2VzKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VkOgorICAgICAgICAgICAgc2VsZi5wYXJzZSgpCisgICAgICAgIGlmIHNlbGYuZXZlbnRzOgorICAgICAgICAgICAgaWYgbm90IGNob2ljZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZvciBjaG9pY2UgaW4gY2hvaWNlczoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZXZlbnRzWzBdLCBjaG9pY2UpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBwZWVrX2V2ZW50KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZWQ6CisgICAgICAgICAgICBzZWxmLnBhcnNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnRzWzBdCisKK2NsYXNzIENhbm9uaWNhbExvYWRlcihDYW5vbmljYWxTY2FubmVyLCBDYW5vbmljYWxQYXJzZXIsCisgICAgICAgIHlhbWwuY29tcG9zZXIuQ29tcG9zZXIsIHlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3IsIHlhbWwucmVzb2x2ZXIuUmVzb2x2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIGlmIGhhc2F0dHIoc3RyZWFtLCAncmVhZCcpOgorICAgICAgICAgICAgc3RyZWFtID0gc3RyZWFtLnJlYWQoKQorICAgICAgICBDYW5vbmljYWxTY2FubmVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSkKKyAgICAgICAgQ2Fub25pY2FsUGFyc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHlhbWwuY29tcG9zZXIuQ29tcG9zZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgeWFtbC5jb25zdHJ1Y3Rvci5Db25zdHJ1Y3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICB5YW1sLnJlc29sdmVyLlJlc29sdmVyLl9faW5pdF9fKHNlbGYpCisKK3lhbWwuQ2Fub25pY2FsTG9hZGVyID0gQ2Fub25pY2FsTG9hZGVyCisKK2RlZiBjYW5vbmljYWxfc2NhbihzdHJlYW0pOgorICAgIHJldHVybiB5YW1sLnNjYW4oc3RyZWFtLCBMb2FkZXI9Q2Fub25pY2FsTG9hZGVyKQorCit5YW1sLmNhbm9uaWNhbF9zY2FuID0gY2Fub25pY2FsX3NjYW4KKworZGVmIGNhbm9uaWNhbF9wYXJzZShzdHJlYW0pOgorICAgIHJldHVybiB5YW1sLnBhcnNlKHN0cmVhbSwgTG9hZGVyPUNhbm9uaWNhbExvYWRlcikKKworeWFtbC5jYW5vbmljYWxfcGFyc2UgPSBjYW5vbmljYWxfcGFyc2UKKworZGVmIGNhbm9uaWNhbF9jb21wb3NlKHN0cmVhbSk6CisgICAgcmV0dXJuIHlhbWwuY29tcG9zZShzdHJlYW0sIExvYWRlcj1DYW5vbmljYWxMb2FkZXIpCisKK3lhbWwuY2Fub25pY2FsX2NvbXBvc2UgPSBjYW5vbmljYWxfY29tcG9zZQorCitkZWYgY2Fub25pY2FsX2NvbXBvc2VfYWxsKHN0cmVhbSk6CisgICAgcmV0dXJuIHlhbWwuY29tcG9zZV9hbGwoc3RyZWFtLCBMb2FkZXI9Q2Fub25pY2FsTG9hZGVyKQorCit5YW1sLmNhbm9uaWNhbF9jb21wb3NlX2FsbCA9IGNhbm9uaWNhbF9jb21wb3NlX2FsbAorCitkZWYgY2Fub25pY2FsX2xvYWQoc3RyZWFtKToKKyAgICByZXR1cm4geWFtbC5sb2FkKHN0cmVhbSwgTG9hZGVyPUNhbm9uaWNhbExvYWRlcikKKworeWFtbC5jYW5vbmljYWxfbG9hZCA9IGNhbm9uaWNhbF9sb2FkCisKK2RlZiBjYW5vbmljYWxfbG9hZF9hbGwoc3RyZWFtKToKKyAgICByZXR1cm4geWFtbC5sb2FkX2FsbChzdHJlYW0sIExvYWRlcj1DYW5vbmljYWxMb2FkZXIpCisKK3lhbWwuY2Fub25pY2FsX2xvYWRfYWxsID0gY2Fub25pY2FsX2xvYWRfYWxsCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2FsbC5weSBiL3Rlc3RzL2xpYi90ZXN0X2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM0YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfYWxsLnB5CkBAIC0wLDAgKzEsMTUgQEAKKworaW1wb3J0IHN5cywgeWFtbCwgdGVzdF9hcHBsaWFuY2UKKworZGVmIG1haW4oYXJncz1Ob25lKToKKyAgICBjb2xsZWN0aW9ucyA9IFtdCisgICAgaW1wb3J0IHRlc3RfeWFtbAorICAgIGNvbGxlY3Rpb25zLmFwcGVuZCh0ZXN0X3lhbWwpCisgICAgaWYgeWFtbC5fX3dpdGhfbGlieWFtbF9fOgorICAgICAgICBpbXBvcnQgdGVzdF95YW1sX2V4dAorICAgICAgICBjb2xsZWN0aW9ucy5hcHBlbmQodGVzdF95YW1sX2V4dCkKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4oY29sbGVjdGlvbnMsIGFyZ3MpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2FwcGxpYW5jZS5weSBiL3Rlc3RzL2xpYi90ZXN0X2FwcGxpYW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBkNWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfYXBwbGlhbmNlLnB5CkBAIC0wLDAgKzEsMTUxIEBACisKK2ltcG9ydCBzeXMsIG9zLCBvcy5wYXRoLCB0eXBlcywgdHJhY2ViYWNrLCBwcHJpbnQKKworREFUQSA9ICd0ZXN0cy9kYXRhJworCitkZWYgZmluZF90ZXN0X2Z1bmN0aW9ucyhjb2xsZWN0aW9ucyk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UoY29sbGVjdGlvbnMsIGxpc3QpOgorICAgICAgICBjb2xsZWN0aW9ucyA9IFtjb2xsZWN0aW9uc10KKyAgICBmdW5jdGlvbnMgPSBbXQorICAgIGZvciBjb2xsZWN0aW9uIGluIGNvbGxlY3Rpb25zOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb2xsZWN0aW9uLCBkaWN0KToKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB2YXJzKGNvbGxlY3Rpb24pCisgICAgICAgIGtleXMgPSBjb2xsZWN0aW9uLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICB2YWx1ZSA9IGNvbGxlY3Rpb25ba2V5XQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZXMuRnVuY3Rpb25UeXBlKSBhbmQgaGFzYXR0cih2YWx1ZSwgJ3VuaXR0ZXN0Jyk6CisgICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFwcGVuZCh2YWx1ZSkKKyAgICByZXR1cm4gZnVuY3Rpb25zCisKK2RlZiBmaW5kX3Rlc3RfZmlsZW5hbWVzKGRpcmVjdG9yeSk6CisgICAgZmlsZW5hbWVzID0ge30KKyAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkpOgorICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy1weTMnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlsZW5hbWVzLnNldGRlZmF1bHQoYmFzZSwgW10pLmFwcGVuZChleHQpCisgICAgZmlsZW5hbWVzID0gZmlsZW5hbWVzLml0ZW1zKCkKKyAgICBmaWxlbmFtZXMuc29ydCgpCisgICAgcmV0dXJuIGZpbGVuYW1lcworCitkZWYgcGFyc2VfYXJndW1lbnRzKGFyZ3MpOgorICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIHZlcmJvc2UgPSBGYWxzZQorICAgIGlmICctdicgaW4gYXJnczoKKyAgICAgICAgdmVyYm9zZSA9IFRydWUKKyAgICAgICAgYXJncy5yZW1vdmUoJy12JykKKyAgICBpZiAnLS12ZXJib3NlJyBpbiBhcmdzOgorICAgICAgICB2ZXJib3NlID0gVHJ1ZQorICAgIGlmICdZQU1MX1RFU1RfVkVSQk9TRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdmVyYm9zZSA9IFRydWUKKyAgICBpbmNsdWRlX2Z1bmN0aW9ucyA9IFtdCisgICAgaWYgYXJnczoKKyAgICAgICAgaW5jbHVkZV9mdW5jdGlvbnMuYXBwZW5kKGFyZ3MucG9wKDApKQorICAgIGlmICdZQU1MX1RFU1RfRlVOQ1RJT05TJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBpbmNsdWRlX2Z1bmN0aW9ucy5leHRlbmQob3MuZW52aXJvblsnWUFNTF9URVNUX0ZVTkNUSU9OUyddLnNwbGl0KCkpCisgICAgaW5jbHVkZV9maWxlbmFtZXMgPSBbXQorICAgIGluY2x1ZGVfZmlsZW5hbWVzLmV4dGVuZChhcmdzKQorICAgIGlmICdZQU1MX1RFU1RfRklMRU5BTUVTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBpbmNsdWRlX2ZpbGVuYW1lcy5leHRlbmQob3MuZW52aXJvblsnWUFNTF9URVNUX0ZJTEVOQU1FUyddLnNwbGl0KCkpCisgICAgcmV0dXJuIGluY2x1ZGVfZnVuY3Rpb25zLCBpbmNsdWRlX2ZpbGVuYW1lcywgdmVyYm9zZQorCitkZWYgZXhlY3V0ZShmdW5jdGlvbiwgZmlsZW5hbWVzLCB2ZXJib3NlKToKKyAgICBpZiBoYXNhdHRyKGZ1bmN0aW9uLCAndW5pdHRlc3RfbmFtZScpOgorICAgICAgICBuYW1lID0gZnVuY3Rpb24udW5pdHRlc3RfbmFtZQorICAgIGVsc2U6CisgICAgICAgIG5hbWUgPSBmdW5jdGlvbi5mdW5jX25hbWUKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCc9Jyo3NSsnXG4nKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclcyglcykuLi5cbicgJSAobmFtZSwgJywgJy5qb2luKGZpbGVuYW1lcykpKQorICAgIHRyeToKKyAgICAgICAgZnVuY3Rpb24odmVyYm9zZT12ZXJib3NlLCAqZmlsZW5hbWVzKQorICAgIGV4Y2VwdCBFeGNlcHRpb24sIGV4YzoKKyAgICAgICAgaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhjLCBBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBraW5kID0gJ0ZBSUxVUkUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBraW5kID0gJ0VSUk9SJworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhsaW1pdD0xLCBmaWxlPXN5cy5zdGRvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGtpbmRbMF0pCisgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICBlbHNlOgorICAgICAgICBraW5kID0gJ1NVQ0NFU1MnCisgICAgICAgIGluZm8gPSBOb25lCisgICAgICAgIGlmIG5vdCB2ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnLicpCisgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgcmV0dXJuIChuYW1lLCBmaWxlbmFtZXMsIGtpbmQsIGluZm8pCisKK2RlZiBkaXNwbGF5KHJlc3VsdHMsIHZlcmJvc2UpOgorICAgIGlmIHJlc3VsdHMgYW5kIG5vdCB2ZXJib3NlOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgdG90YWwgPSBsZW4ocmVzdWx0cykKKyAgICBmYWlsdXJlcyA9IDAKKyAgICBlcnJvcnMgPSAwCisgICAgZm9yIG5hbWUsIGZpbGVuYW1lcywga2luZCwgaW5mbyBpbiByZXN1bHRzOgorICAgICAgICBpZiBraW5kID09ICdTVUNDRVNTJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGtpbmQgPT0gJ0ZBSUxVUkUnOgorICAgICAgICAgICAgZmFpbHVyZXMgKz0gMQorICAgICAgICBpZiBraW5kID09ICdFUlJPUic6CisgICAgICAgICAgICBlcnJvcnMgKz0gMQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCc9Jyo3NSsnXG4nKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclcyglcyk6ICVzXG4nICUgKG5hbWUsICcsICcuam9pbihmaWxlbmFtZXMpLCBraW5kKSkKKyAgICAgICAgaWYga2luZCA9PSAnRVJST1InOgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihmaWxlPXN5cy5zdGRvdXQsICppbmZvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJykKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF90YihpbmZvWzJdLCBmaWxlPXN5cy5zdGRvdXQpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclczogc2VlIGJlbG93XG4nICUgaW5mb1swXS5fX25hbWVfXykKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ34nKjc1KydcbicpCisgICAgICAgICAgICBmb3IgYXJnIGluIGluZm9bMV0uYXJnczoKKyAgICAgICAgICAgICAgICBwcHJpbnQucHByaW50KGFyZywgc3RyZWFtPXN5cy5zdGRvdXQpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCctJyo3NSsnXG4nKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnJXM6XG4nICUgZmlsZW5hbWUpCisgICAgICAgICAgICBkYXRhID0gb3BlbihmaWxlbmFtZSwgJ3JiJykucmVhZCgpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEpCisgICAgICAgICAgICBpZiBkYXRhIGFuZCBkYXRhWy0xXSAhPSAnXG4nOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICBzeXMuc3Rkb3V0LndyaXRlKCc9Jyo3NSsnXG4nKQorICAgIHN5cy5zdGRvdXQud3JpdGUoJ1RFU1RTOiAlc1xuJyAlIHRvdGFsKQorICAgIGlmIGZhaWx1cmVzOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdGQUlMVVJFUzogJXNcbicgJSBmYWlsdXJlcykKKyAgICBpZiBlcnJvcnM6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ0VSUk9SUzogJXNcbicgJSBlcnJvcnMpCisKK2RlZiBydW4oY29sbGVjdGlvbnMsIGFyZ3M9Tm9uZSk6CisgICAgdGVzdF9mdW5jdGlvbnMgPSBmaW5kX3Rlc3RfZnVuY3Rpb25zKGNvbGxlY3Rpb25zKQorICAgIHRlc3RfZmlsZW5hbWVzID0gZmluZF90ZXN0X2ZpbGVuYW1lcyhEQVRBKQorICAgIGluY2x1ZGVfZnVuY3Rpb25zLCBpbmNsdWRlX2ZpbGVuYW1lcywgdmVyYm9zZSA9IHBhcnNlX2FyZ3VtZW50cyhhcmdzKQorICAgIHJlc3VsdHMgPSBbXQorICAgIGZvciBmdW5jdGlvbiBpbiB0ZXN0X2Z1bmN0aW9uczoKKyAgICAgICAgaWYgaW5jbHVkZV9mdW5jdGlvbnMgYW5kIGZ1bmN0aW9uLmZ1bmNfbmFtZSBub3QgaW4gaW5jbHVkZV9mdW5jdGlvbnM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBmdW5jdGlvbi51bml0dGVzdDoKKyAgICAgICAgICAgIGZvciBiYXNlLCBleHRzIGluIHRlc3RfZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIGlmIGluY2x1ZGVfZmlsZW5hbWVzIGFuZCBiYXNlIG5vdCBpbiBpbmNsdWRlX2ZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBleHQgaW4gZnVuY3Rpb24udW5pdHRlc3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gZXh0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQob3MucGF0aC5qb2luKERBVEEsIGJhc2UrZXh0KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBza2lwX2V4dHMgPSBnZXRhdHRyKGZ1bmN0aW9uLCAnc2tpcCcsIFtdKQorICAgICAgICAgICAgICAgICAgICBmb3Igc2tpcF9leHQgaW4gc2tpcF9leHRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2tpcF9leHQgaW4gZXh0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZShmdW5jdGlvbiwgZmlsZW5hbWVzLCB2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVzdWx0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZShmdW5jdGlvbiwgW10sIHZlcmJvc2UpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpCisgICAgZGlzcGxheShyZXN1bHRzLCB2ZXJib3NlPXZlcmJvc2UpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2J1aWxkLnB5IGIvdGVzdHMvbGliL3Rlc3RfYnVpbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZThlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X2J1aWxkLnB5CkBAIC0wLDAgKzEsMTAgQEAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzLCBvcywgZGlzdHV0aWxzLnV0aWwKKyAgICBidWlsZF9saWIgPSAnYnVpbGQvbGliJworICAgIGJ1aWxkX2xpYl9leHQgPSBvcy5wYXRoLmpvaW4oJ2J1aWxkJywgJ2xpYi4lcy0lcycgJSAoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBidWlsZF9saWIpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGJ1aWxkX2xpYl9leHQpCisgICAgaW1wb3J0IHRlc3RfeWFtbCwgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4odGVzdF95YW1sKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIvdGVzdF9idWlsZF9leHQucHkgYi90ZXN0cy9saWIvdGVzdF9idWlsZF9leHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxOTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X2J1aWxkX2V4dC5weQpAQCAtMCwwICsxLDExIEBACisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzLCBvcywgZGlzdHV0aWxzLnV0aWwKKyAgICBidWlsZF9saWIgPSAnYnVpbGQvbGliJworICAgIGJ1aWxkX2xpYl9leHQgPSBvcy5wYXRoLmpvaW4oJ2J1aWxkJywgJ2xpYi4lcy0lcycgJSAoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBidWlsZF9saWIpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGJ1aWxkX2xpYl9leHQpCisgICAgaW1wb3J0IHRlc3RfeWFtbF9leHQsIHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKHRlc3RfeWFtbF9leHQpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2Nhbm9uaWNhbC5weSBiL3Rlc3RzL2xpYi90ZXN0X2Nhbm9uaWNhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUxZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfY2Fub25pY2FsLnB5CkBAIC0wLDAgKzEsNDAgQEAKKworaW1wb3J0IHlhbWwsIGNhbm9uaWNhbAorCitkZWYgdGVzdF9jYW5vbmljYWxfc2Nhbm5lcihjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGRhdGEgPSBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpCisgICAgdG9rZW5zID0gbGlzdCh5YW1sLmNhbm9uaWNhbF9zY2FuKGRhdGEpKQorICAgIGFzc2VydCB0b2tlbnMsIHRva2VucworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CisgICAgICAgICAgICBwcmludCB0b2tlbgorCit0ZXN0X2Nhbm9uaWNhbF9zY2FubmVyLnVuaXR0ZXN0ID0gWycuY2Fub25pY2FsJ10KKworZGVmIHRlc3RfY2Fub25pY2FsX3BhcnNlcihjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGRhdGEgPSBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpCisgICAgZXZlbnRzID0gbGlzdCh5YW1sLmNhbm9uaWNhbF9wYXJzZShkYXRhKSkKKyAgICBhc3NlcnQgZXZlbnRzLCBldmVudHMKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBmb3IgZXZlbnQgaW4gZXZlbnRzOgorICAgICAgICAgICAgcHJpbnQgZXZlbnQKKwordGVzdF9jYW5vbmljYWxfcGFyc2VyLnVuaXR0ZXN0ID0gWycuY2Fub25pY2FsJ10KKworZGVmIHRlc3RfY2Fub25pY2FsX2Vycm9yKGRhdGFfZmlsZW5hbWUsIGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZGF0YSA9IG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykucmVhZCgpCisgICAgdHJ5OgorICAgICAgICBvdXRwdXQgPSBsaXN0KHlhbWwuY2Fub25pY2FsX2xvYWRfYWxsKGRhdGEpKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciwgZXhjOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfY2Fub25pY2FsX2Vycm9yLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KK3Rlc3RfY2Fub25pY2FsX2Vycm9yLnNraXAgPSBbJy5lbXB0eSddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL3Rlc3RfY29uc3RydWN0b3IucHkgYi90ZXN0cy9saWIvdGVzdF9jb25zdHJ1Y3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVlN2IwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfY29uc3RydWN0b3IucHkKQEAgLTAsMCArMSwyNzUgQEAKKworaW1wb3J0IHlhbWwKK2ltcG9ydCBwcHJpbnQKKworaW1wb3J0IGRhdGV0aW1lCit0cnk6CisgICAgc2V0CitleGNlcHQgTmFtZUVycm9yOgorICAgIGZyb20gc2V0cyBpbXBvcnQgU2V0IGFzIHNldAoraW1wb3J0IHlhbWwudG9rZW5zCisKK2RlZiBleGVjdXRlKGNvZGUpOgorICAgIGV4ZWMgY29kZQorICAgIHJldHVybiB2YWx1ZQorCitkZWYgX21ha2Vfb2JqZWN0cygpOgorICAgIGdsb2JhbCBNeUxvYWRlciwgTXlEdW1wZXIsIE15VGVzdENsYXNzMSwgTXlUZXN0Q2xhc3MyLCBNeVRlc3RDbGFzczMsIFlBTUxPYmplY3QxLCBZQU1MT2JqZWN0MiwgIFwKKyAgICAgICAgICAgIEFuT2JqZWN0LCBBbkluc3RhbmNlLCBBU3RhdGUsIEFDdXN0b21TdGF0ZSwgSW5pdEFyZ3MsIEluaXRBcmdzV2l0aFN0YXRlLCAgICBcCisgICAgICAgICAgICBOZXdBcmdzLCBOZXdBcmdzV2l0aFN0YXRlLCBSZWR1Y2UsIFJlZHVjZVdpdGhTdGF0ZSwgTXlJbnQsIE15TGlzdCwgTXlEaWN0LCAgXAorICAgICAgICAgICAgRml4ZWRPZmZzZXQsIHRvZGF5LCBleGVjdXRlCisKKyAgICBjbGFzcyBNeUxvYWRlcih5YW1sLkxvYWRlcik6CisgICAgICAgIHBhc3MKKyAgICBjbGFzcyBNeUR1bXBlcih5YW1sLkR1bXBlcik6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIE15VGVzdENsYXNzMToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHk9MCwgej0wKToKKyAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIHNlbGYueSA9IHkKKyAgICAgICAgICAgIHNlbGYueiA9IHoKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBNeVRlc3RDbGFzczEpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2NsYXNzX18sIG90aGVyLl9fZGljdF9fCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGNvbnN0cnVjdDEoY29uc3RydWN0b3IsIG5vZGUpOgorICAgICAgICBtYXBwaW5nID0gY29uc3RydWN0b3IuY29uc3RydWN0X21hcHBpbmcobm9kZSkKKyAgICAgICAgcmV0dXJuIE15VGVzdENsYXNzMSgqKm1hcHBpbmcpCisgICAgZGVmIHJlcHJlc2VudDEocmVwcmVzZW50ZXIsIG5hdGl2ZSk6CisgICAgICAgIHJldHVybiByZXByZXNlbnRlci5yZXByZXNlbnRfbWFwcGluZygiIXRhZzEiLCBuYXRpdmUuX19kaWN0X18pCisKKyAgICB5YW1sLmFkZF9jb25zdHJ1Y3RvcigiIXRhZzEiLCBjb25zdHJ1Y3QxLCBMb2FkZXI9TXlMb2FkZXIpCisgICAgeWFtbC5hZGRfcmVwcmVzZW50ZXIoTXlUZXN0Q2xhc3MxLCByZXByZXNlbnQxLCBEdW1wZXI9TXlEdW1wZXIpCisKKyAgICBjbGFzcyBNeVRlc3RDbGFzczIoTXlUZXN0Q2xhc3MxLCB5YW1sLllBTUxPYmplY3QpOgorICAgICAgICB5YW1sX2xvYWRlciA9IE15TG9hZGVyCisgICAgICAgIHlhbWxfZHVtcGVyID0gTXlEdW1wZXIKKyAgICAgICAgeWFtbF90YWcgPSAiIXRhZzIiCisgICAgICAgIGRlZiBmcm9tX3lhbWwoY2xzLCBjb25zdHJ1Y3Rvciwgbm9kZSk6CisgICAgICAgICAgICB4ID0gY29uc3RydWN0b3IuY29uc3RydWN0X3lhbWxfaW50KG5vZGUpCisgICAgICAgICAgICByZXR1cm4gY2xzKHg9eCkKKyAgICAgICAgZnJvbV95YW1sID0gY2xhc3NtZXRob2QoZnJvbV95YW1sKQorICAgICAgICBkZWYgdG9feWFtbChjbHMsIHJlcHJlc2VudGVyLCBuYXRpdmUpOgorICAgICAgICAgICAgcmV0dXJuIHJlcHJlc2VudGVyLnJlcHJlc2VudF9zY2FsYXIoY2xzLnlhbWxfdGFnLCBzdHIobmF0aXZlLngpKQorICAgICAgICB0b195YW1sID0gY2xhc3NtZXRob2QodG9feWFtbCkKKworICAgIGNsYXNzIE15VGVzdENsYXNzMyhNeVRlc3RDbGFzczIpOgorICAgICAgICB5YW1sX3RhZyA9ICIhdGFnMyIKKyAgICAgICAgZGVmIGZyb21feWFtbChjbHMsIGNvbnN0cnVjdG9yLCBub2RlKToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfbWFwcGluZyhub2RlKQorICAgICAgICAgICAgaWYgJz0nIGluIG1hcHBpbmc6CisgICAgICAgICAgICAgICAgeCA9IG1hcHBpbmdbJz0nXQorICAgICAgICAgICAgICAgIGRlbCBtYXBwaW5nWyc9J10KKyAgICAgICAgICAgICAgICBtYXBwaW5nWyd4J10gPSB4CisgICAgICAgICAgICByZXR1cm4gY2xzKCoqbWFwcGluZykKKyAgICAgICAgZnJvbV95YW1sID0gY2xhc3NtZXRob2QoZnJvbV95YW1sKQorICAgICAgICBkZWYgdG9feWFtbChjbHMsIHJlcHJlc2VudGVyLCBuYXRpdmUpOgorICAgICAgICAgICAgcmV0dXJuIHJlcHJlc2VudGVyLnJlcHJlc2VudF9tYXBwaW5nKGNscy55YW1sX3RhZywgbmF0aXZlLl9fZGljdF9fKQorICAgICAgICB0b195YW1sID0gY2xhc3NtZXRob2QodG9feWFtbCkKKworICAgIGNsYXNzIFlBTUxPYmplY3QxKHlhbWwuWUFNTE9iamVjdCk6CisgICAgICAgIHlhbWxfbG9hZGVyID0gTXlMb2FkZXIKKyAgICAgICAgeWFtbF9kdW1wZXIgPSBNeUR1bXBlcgorICAgICAgICB5YW1sX3RhZyA9ICchZm9vJworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbXlfcGFyYW1ldGVyPU5vbmUsIG15X2Fub3RoZXJfcGFyYW1ldGVyPU5vbmUpOgorICAgICAgICAgICAgc2VsZi5teV9wYXJhbWV0ZXIgPSBteV9wYXJhbWV0ZXIKKyAgICAgICAgICAgIHNlbGYubXlfYW5vdGhlcl9wYXJhbWV0ZXIgPSBteV9hbm90aGVyX3BhcmFtZXRlcgorICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFlBTUxPYmplY3QxKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19jbGFzc19fLCBvdGhlci5fX2RpY3RfXworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGNsYXNzIFlBTUxPYmplY3QyKHlhbWwuWUFNTE9iamVjdCk6CisgICAgICAgIHlhbWxfbG9hZGVyID0gTXlMb2FkZXIKKyAgICAgICAgeWFtbF9kdW1wZXIgPSBNeUR1bXBlcgorICAgICAgICB5YW1sX3RhZyA9ICchYmFyJworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vPTEsIGJhcj0yLCBiYXo9Myk6CisgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgc2VsZi5iYXIgPSBiYXIKKyAgICAgICAgICAgIHNlbGYuYmF6ID0gYmF6CisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gezE6IHNlbGYuZm9vLCAyOiBzZWxmLmJhciwgMzogc2VsZi5iYXp9CisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgc2VsZi5mb28gPSBzdGF0ZVsxXQorICAgICAgICAgICAgc2VsZi5iYXIgPSBzdGF0ZVsyXQorICAgICAgICAgICAgc2VsZi5iYXogPSBzdGF0ZVszXQorICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFlBTUxPYmplY3QyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19jbGFzc19fLCBvdGhlci5fX2RpY3RfXworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGNsYXNzIEFuT2JqZWN0KG9iamVjdCk6CisgICAgICAgIGRlZiBfX25ld19fKGNscywgZm9vPU5vbmUsIGJhcj1Ob25lLCBiYXo9Tm9uZSk6CisgICAgICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgICAgICBzZWxmLmJheiA9IGJhegorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIGNtcCgodHlwZShzZWxmKSwgc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheiksCisgICAgICAgICAgICAgICAgICAgICh0eXBlKG90aGVyKSwgb3RoZXIuZm9vLCBvdGhlci5iYXIsIG90aGVyLmJheikpCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikgaXMgdHlwZShvdGhlcikgYW5kICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZm9vLCBzZWxmLmJhciwgc2VsZi5iYXopID09IChvdGhlci5mb28sIG90aGVyLmJhciwgb3RoZXIuYmF6KQorCisgICAgY2xhc3MgQW5JbnN0YW5jZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbz1Ob25lLCBiYXI9Tm9uZSwgYmF6PU5vbmUpOgorICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgICAgICBzZWxmLmJheiA9IGJhegorICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gY21wKCh0eXBlKHNlbGYpLCBzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6KSwKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUob3RoZXIpLCBvdGhlci5mb28sIG90aGVyLmJhciwgb3RoZXIuYmF6KSkKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKSBpcyB0eXBlKG90aGVyKSBhbmQgICAgXAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheikgPT0gKG90aGVyLmZvbywgb3RoZXIuYmFyLCBvdGhlci5iYXopCisKKyAgICBjbGFzcyBBU3RhdGUoQW5JbnN0YW5jZSk6CisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICdfZm9vJzogc2VsZi5mb28sCisgICAgICAgICAgICAgICAgJ19iYXInOiBzZWxmLmJhciwKKyAgICAgICAgICAgICAgICAnX2Jheic6IHNlbGYuYmF6LAorICAgICAgICAgICAgfQorICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgIHNlbGYuZm9vID0gc3RhdGVbJ19mb28nXQorICAgICAgICAgICAgc2VsZi5iYXIgPSBzdGF0ZVsnX2JhciddCisgICAgICAgICAgICBzZWxmLmJheiA9IHN0YXRlWydfYmF6J10KKworICAgIGNsYXNzIEFDdXN0b21TdGF0ZShBbkluc3RhbmNlKToKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheikKKyAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICBzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6ID0gc3RhdGUKKworICAgIGNsYXNzIEluaXRBcmdzKEFuSW5zdGFuY2UpOgorICAgICAgICBkZWYgX19nZXRpbml0YXJnc19fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6KQorICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHt9CisKKyAgICBjbGFzcyBJbml0QXJnc1dpdGhTdGF0ZShBbkluc3RhbmNlKToKKyAgICAgICAgZGVmIF9fZ2V0aW5pdGFyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sIHNlbGYuYmFyKQorICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmF6CisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgc2VsZi5iYXogPSBzdGF0ZQorCisgICAgY2xhc3MgTmV3QXJncyhBbk9iamVjdCk6CisgICAgICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheikKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiB7fQorCisgICAgY2xhc3MgTmV3QXJnc1dpdGhTdGF0ZShBbk9iamVjdCk6CisgICAgICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sIHNlbGYuYmFyKQorICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmF6CisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgc2VsZi5iYXogPSBzdGF0ZQorCisgICAgY2xhc3MgUmVkdWNlKEFuT2JqZWN0KToKKyAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6KQorCisgICAgY2xhc3MgUmVkdWNlV2l0aFN0YXRlKEFuT2JqZWN0KToKKyAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChzZWxmLmZvbywgc2VsZi5iYXIpLCBzZWxmLmJhegorICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgIHNlbGYuYmF6ID0gc3RhdGUKKworICAgIGNsYXNzIE15SW50KGludCk6CisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikgaXMgdHlwZShvdGhlcikgYW5kIGludChzZWxmKSA9PSBpbnQob3RoZXIpCisKKyAgICBjbGFzcyBNeUxpc3QobGlzdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuPTEpOgorICAgICAgICAgICAgc2VsZi5leHRlbmQoW05vbmVdKm4pCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikgaXMgdHlwZShvdGhlcikgYW5kIGxpc3Qoc2VsZikgPT0gbGlzdChvdGhlcikKKworICAgIGNsYXNzIE15RGljdChkaWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG49MSk6CisgICAgICAgICAgICBmb3IgayBpbiByYW5nZShuKToKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gTm9uZQorICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpIGlzIHR5cGUob3RoZXIpIGFuZCBkaWN0KHNlbGYpID09IGRpY3Qob3RoZXIpCisKKyAgICBjbGFzcyBGaXhlZE9mZnNldChkYXRldGltZS50emluZm8pOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYuX19vZmZzZXQgPSBkYXRldGltZS50aW1lZGVsdGEobWludXRlcz1vZmZzZXQpCisgICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX29mZnNldAorICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQorICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgICAgIHJldHVybiBkYXRldGltZS50aW1lZGVsdGEoMCkKKworICAgIHRvZGF5ID0gZGF0ZXRpbWUuZGF0ZS50b2RheSgpCisKK2RlZiBfbG9hZF9jb2RlKGV4cHJlc3Npb24pOgorICAgIHJldHVybiBldmFsKGV4cHJlc3Npb24pCisKK2RlZiBfc2VyaWFsaXplX3ZhbHVlKGRhdGEpOgorICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCk6CisgICAgICAgIHJldHVybiAnWyVzXScgJSAnLCAnLmpvaW4obWFwKF9zZXJpYWxpemVfdmFsdWUsIGRhdGEpKQorICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICBrZXkgPSBfc2VyaWFsaXplX3ZhbHVlKGtleSkKKyAgICAgICAgICAgIHZhbHVlID0gX3NlcmlhbGl6ZV92YWx1ZSh2YWx1ZSkKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgiJXM6ICVzIiAlIChrZXksIHZhbHVlKSkKKyAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgIHJldHVybiAneyVzfScgJSAnLCAnLmpvaW4oaXRlbXMpCisgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGRhdGV0aW1lLmRhdGV0aW1lKToKKyAgICAgICAgcmV0dXJuIHJlcHIoZGF0YS51dGN0aW1ldHVwbGUoKSkKKyAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CisgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmLTgnKQorICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCBmbG9hdCkgYW5kIGRhdGEgIT0gZGF0YToKKyAgICAgICAgcmV0dXJuICc/JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzdHIoZGF0YSkKKworZGVmIHRlc3RfY29uc3RydWN0b3JfdHlwZXMoZGF0YV9maWxlbmFtZSwgY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2Vfb2JqZWN0cygpCisgICAgbmF0aXZlMSA9IE5vbmUKKyAgICBuYXRpdmUyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgbmF0aXZlMSA9IGxpc3QoeWFtbC5sb2FkX2FsbChvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLCBMb2FkZXI9TXlMb2FkZXIpKQorICAgICAgICBpZiBsZW4obmF0aXZlMSkgPT0gMToKKyAgICAgICAgICAgIG5hdGl2ZTEgPSBuYXRpdmUxWzBdCisgICAgICAgIG5hdGl2ZTIgPSBfbG9hZF9jb2RlKG9wZW4oY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBuYXRpdmUxID09IG5hdGl2ZTI6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiU0VSSUFMSVpFRCBOQVRJVkUxOiIKKyAgICAgICAgICAgIHByaW50IF9zZXJpYWxpemVfdmFsdWUobmF0aXZlMSkKKyAgICAgICAgICAgIHByaW50ICJTRVJJQUxJWkVEIE5BVElWRTI6IgorICAgICAgICAgICAgcHJpbnQgX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUyKQorICAgICAgICBhc3NlcnQgX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUxKSA9PSBfc2VyaWFsaXplX3ZhbHVlKG5hdGl2ZTIpLCAobmF0aXZlMSwgbmF0aXZlMikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk5BVElWRTE6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUxKQorICAgICAgICAgICAgcHJpbnQgIk5BVElWRTI6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUyKQorCit0ZXN0X2NvbnN0cnVjdG9yX3R5cGVzLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY29kZSddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cywgdGVzdF9jb25zdHJ1Y3RvcgorICAgIHN5cy5tb2R1bGVzWyd0ZXN0X2NvbnN0cnVjdG9yJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2VtaXR0ZXIucHkgYi90ZXN0cy9saWIvdGVzdF9lbWl0dGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmQ5NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvdGVzdF9lbWl0dGVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisKK2ltcG9ydCB5YW1sCisKK2RlZiBfY29tcGFyZV9ldmVudHMoZXZlbnRzMSwgZXZlbnRzMik6CisgICAgYXNzZXJ0IGxlbihldmVudHMxKSA9PSBsZW4oZXZlbnRzMiksIChldmVudHMxLCBldmVudHMyKQorICAgIGZvciBldmVudDEsIGV2ZW50MiBpbiB6aXAoZXZlbnRzMSwgZXZlbnRzMik6CisgICAgICAgIGFzc2VydCBldmVudDEuX19jbGFzc19fID09IGV2ZW50Mi5fX2NsYXNzX18sIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudDEsIHlhbWwuTm9kZUV2ZW50KToKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEuYW5jaG9yID09IGV2ZW50Mi5hbmNob3IsIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudDEsIHlhbWwuQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgYXNzZXJ0IGV2ZW50MS50YWcgPT0gZXZlbnQyLnRhZywgKGV2ZW50MSwgZXZlbnQyKQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50MSwgeWFtbC5TY2FsYXJFdmVudCk6CisgICAgICAgICAgICBpZiBUcnVlIG5vdCBpbiBldmVudDEuaW1wbGljaXQrZXZlbnQyLmltcGxpY2l0OgorICAgICAgICAgICAgICAgIGFzc2VydCBldmVudDEudGFnID09IGV2ZW50Mi50YWcsIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEudmFsdWUgPT0gZXZlbnQyLnZhbHVlLCAoZXZlbnQxLCBldmVudDIpCisKK2RlZiB0ZXN0X2VtaXR0ZXJfb25fZGF0YShkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKSkKKyAgICBvdXRwdXQgPSB5YW1sLmVtaXQoZXZlbnRzKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICJPVVRQVVQ6IgorICAgICAgICBwcmludCBvdXRwdXQKKyAgICBuZXdfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG91dHB1dCkpCisgICAgX2NvbXBhcmVfZXZlbnRzKGV2ZW50cywgbmV3X2V2ZW50cykKKwordGVzdF9lbWl0dGVyX29uX2RhdGEudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQorCitkZWYgdGVzdF9lbWl0dGVyX29uX2Nhbm9uaWNhbChjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykpKQorICAgIGZvciBjYW5vbmljYWwgaW4gW0ZhbHNlLCBUcnVlXToKKyAgICAgICAgb3V0cHV0ID0geWFtbC5lbWl0KGV2ZW50cywgY2Fub25pY2FsPWNhbm9uaWNhbCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJPVVRQVVQgKGNhbm9uaWNhbD0lcyk6IiAlIGNhbm9uaWNhbAorICAgICAgICAgICAgcHJpbnQgb3V0cHV0CisgICAgICAgIG5ld19ldmVudHMgPSBsaXN0KHlhbWwucGFyc2Uob3V0cHV0KSkKKyAgICAgICAgX2NvbXBhcmVfZXZlbnRzKGV2ZW50cywgbmV3X2V2ZW50cykKKwordGVzdF9lbWl0dGVyX29uX2Nhbm9uaWNhbC51bml0dGVzdCA9IFsnLmNhbm9uaWNhbCddCisKK2RlZiB0ZXN0X2VtaXR0ZXJfc3R5bGVzKGRhdGFfZmlsZW5hbWUsIGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZm9yIGZpbGVuYW1lIGluIFtkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWVdOgorICAgICAgICBldmVudHMgPSBsaXN0KHlhbWwucGFyc2Uob3BlbihmaWxlbmFtZSwgJ3JiJykpKQorICAgICAgICBmb3IgZmxvd19zdHlsZSBpbiBbRmFsc2UsIFRydWVdOgorICAgICAgICAgICAgZm9yIHN0eWxlIGluIFsnfCcsICc+JywgJyInLCAnXCcnLCAnJ106CisgICAgICAgICAgICAgICAgc3R5bGVkX2V2ZW50cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgeWFtbC5TY2FsYXJFdmVudCk6CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHlhbWwuU2NhbGFyRXZlbnQoZXZlbnQuYW5jaG9yLCBldmVudC50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmltcGxpY2l0LCBldmVudC52YWx1ZSwgc3R5bGU9c3R5bGUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgeWFtbC5TZXF1ZW5jZVN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSB5YW1sLlNlcXVlbmNlU3RhcnRFdmVudChldmVudC5hbmNob3IsIGV2ZW50LnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW1wbGljaXQsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCB5YW1sLk1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0geWFtbC5NYXBwaW5nU3RhcnRFdmVudChldmVudC5hbmNob3IsIGV2ZW50LnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW1wbGljaXQsIGZsb3dfc3R5bGU9Zmxvd19zdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVkX2V2ZW50cy5hcHBlbmQoZXZlbnQpCisgICAgICAgICAgICAgICAgb3V0cHV0ID0geWFtbC5lbWl0KHN0eWxlZF9ldmVudHMpCisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIk9VVFBVVCAoZmlsZW5hbWU9JXIsIGZsb3dfc3R5bGU9JXIsIHN0eWxlPSVyKSIgJSAoZmlsZW5hbWUsIGZsb3dfc3R5bGUsIHN0eWxlKQorICAgICAgICAgICAgICAgICAgICBwcmludCBvdXRwdXQKKyAgICAgICAgICAgICAgICBuZXdfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG91dHB1dCkpCisgICAgICAgICAgICAgICAgX2NvbXBhcmVfZXZlbnRzKGV2ZW50cywgbmV3X2V2ZW50cykKKwordGVzdF9lbWl0dGVyX3N0eWxlcy51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmNhbm9uaWNhbCddCisKK2NsYXNzIEV2ZW50c0xvYWRlcih5YW1sLkxvYWRlcik6CisKKyAgICBkZWYgY29uc3RydWN0X2V2ZW50KHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHlhbWwuU2NhbGFyTm9kZSk6CisgICAgICAgICAgICBtYXBwaW5nID0ge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUpCisgICAgICAgIGNsYXNzX25hbWUgPSBzdHIobm9kZS50YWdbMTpdKSsnRXZlbnQnCisgICAgICAgIGlmIGNsYXNzX25hbWUgaW4gWydBbGlhc0V2ZW50JywgJ1NjYWxhckV2ZW50JywgJ1NlcXVlbmNlU3RhcnRFdmVudCcsICdNYXBwaW5nU3RhcnRFdmVudCddOgorICAgICAgICAgICAgbWFwcGluZy5zZXRkZWZhdWx0KCdhbmNob3InLCBOb25lKQorICAgICAgICBpZiBjbGFzc19uYW1lIGluIFsnU2NhbGFyRXZlbnQnLCAnU2VxdWVuY2VTdGFydEV2ZW50JywgJ01hcHBpbmdTdGFydEV2ZW50J106CisgICAgICAgICAgICBtYXBwaW5nLnNldGRlZmF1bHQoJ3RhZycsIE5vbmUpCisgICAgICAgIGlmIGNsYXNzX25hbWUgaW4gWydTZXF1ZW5jZVN0YXJ0RXZlbnQnLCAnTWFwcGluZ1N0YXJ0RXZlbnQnXToKKyAgICAgICAgICAgIG1hcHBpbmcuc2V0ZGVmYXVsdCgnaW1wbGljaXQnLCBUcnVlKQorICAgICAgICBpZiBjbGFzc19uYW1lID09ICdTY2FsYXJFdmVudCc6CisgICAgICAgICAgICBtYXBwaW5nLnNldGRlZmF1bHQoJ2ltcGxpY2l0JywgKEZhbHNlLCBUcnVlKSkKKyAgICAgICAgICAgIG1hcHBpbmcuc2V0ZGVmYXVsdCgndmFsdWUnLCAnJykKKyAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHlhbWwsIGNsYXNzX25hbWUpKCoqbWFwcGluZykKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKK0V2ZW50c0xvYWRlci5hZGRfY29uc3RydWN0b3IoTm9uZSwgRXZlbnRzTG9hZGVyLmNvbnN0cnVjdF9ldmVudCkKKworZGVmIHRlc3RfZW1pdHRlcl9ldmVudHMoZXZlbnRzX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBldmVudHMgPSBsaXN0KHlhbWwubG9hZChvcGVuKGV2ZW50c19maWxlbmFtZSwgJ3JiJyksIExvYWRlcj1FdmVudHNMb2FkZXIpKQorICAgIG91dHB1dCA9IHlhbWwuZW1pdChldmVudHMpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgIk9VVFBVVDoiCisgICAgICAgIHByaW50IG91dHB1dAorICAgIG5ld19ldmVudHMgPSBsaXN0KHlhbWwucGFyc2Uob3V0cHV0KSkKKyAgICBfY29tcGFyZV9ldmVudHMoZXZlbnRzLCBuZXdfZXZlbnRzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2Vycm9ycy5weSBiL3Rlc3RzL2xpYi90ZXN0X2Vycm9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGM5Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfZXJyb3JzLnB5CkBAIC0wLDAgKzEsNjcgQEAKKworaW1wb3J0IHlhbWwsIHRlc3RfZW1pdHRlcgorCitkZWYgdGVzdF9sb2FkZXJfZXJyb3IoZXJyb3JfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIHRyeToKKyAgICAgICAgbGlzdCh5YW1sLmxvYWRfYWxsKG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpKSkKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczoiICUgZXhjLl9fY2xhc3NfXy5fX25hbWVfXywgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfbG9hZGVyX2Vycm9yLnVuaXR0ZXN0ID0gWycubG9hZGVyLWVycm9yJ10KKworZGVmIHRlc3RfbG9hZGVyX2Vycm9yX3N0cmluZyhlcnJvcl9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgdHJ5OgorICAgICAgICBsaXN0KHlhbWwubG9hZF9hbGwob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJykucmVhZCgpKSkKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczoiICUgZXhjLl9fY2xhc3NfXy5fX25hbWVfXywgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfbG9hZGVyX2Vycm9yX3N0cmluZy51bml0dGVzdCA9IFsnLmxvYWRlci1lcnJvciddCisKK2RlZiB0ZXN0X2xvYWRlcl9lcnJvcl9zaW5nbGUoZXJyb3JfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIHRyeToKKyAgICAgICAgeWFtbC5sb2FkKG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpLnJlYWQoKSkKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczoiICUgZXhjLl9fY2xhc3NfXy5fX25hbWVfXywgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfbG9hZGVyX2Vycm9yX3NpbmdsZS51bml0dGVzdCA9IFsnLnNpbmdsZS1sb2FkZXItZXJyb3InXQorCitkZWYgdGVzdF9lbWl0dGVyX2Vycm9yKGVycm9yX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBldmVudHMgPSBsaXN0KHlhbWwubG9hZChvcGVuKGVycm9yX2ZpbGVuYW1lLCAncmInKSwKKyAgICAgICAgICAgICAgICAgICAgTG9hZGVyPXRlc3RfZW1pdHRlci5FdmVudHNMb2FkZXIpKQorICAgIHRyeToKKyAgICAgICAgeWFtbC5lbWl0KGV2ZW50cykKKyAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczoiICUgZXhjLl9fY2xhc3NfXy5fX25hbWVfXywgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfZW1pdHRlcl9lcnJvci51bml0dGVzdCA9IFsnLmVtaXR0ZXItZXJyb3InXQorCitkZWYgdGVzdF9kdW1wZXJfZXJyb3IoZXJyb3JfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGNvZGUgPSBvcGVuKGVycm9yX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB5YW1sCisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGV4ZWMgY29kZQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciwgZXhjOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiIgJSBleGMuX19jbGFzc19fLl9fbmFtZV9fLCBleGMKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9kdW1wZXJfZXJyb3IudW5pdHRlc3QgPSBbJy5kdW1wZXItZXJyb3InXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X2lucHV0X291dHB1dC5weSBiL3Rlc3RzL2xpYi90ZXN0X2lucHV0X291dHB1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NjOGZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfaW5wdXRfb3V0cHV0LnB5CkBAIC0wLDAgKzEsMTUxIEBACisKK2ltcG9ydCB5YW1sCitpbXBvcnQgY29kZWNzLCBTdHJpbmdJTywgdGVtcGZpbGUsIG9zLCBvcy5wYXRoCisKK2RlZiBfdW5pY29kZV9vcGVuKGZpbGUsIGVuY29kaW5nLCBlcnJvcnM9J3N0cmljdCcpOgorICAgIGluZm8gPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKQorICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgdHVwbGUpOgorICAgICAgICByZWFkZXIgPSBpbmZvWzJdCisgICAgICAgIHdyaXRlciA9IGluZm9bM10KKyAgICBlbHNlOgorICAgICAgICByZWFkZXIgPSBpbmZvLnN0cmVhbXJlYWRlcgorICAgICAgICB3cml0ZXIgPSBpbmZvLnN0cmVhbXdyaXRlcgorICAgIHNydyA9IGNvZGVjcy5TdHJlYW1SZWFkZXJXcml0ZXIoZmlsZSwgcmVhZGVyLCB3cml0ZXIsIGVycm9ycykKKyAgICBzcncuZW5jb2RpbmcgPSBlbmNvZGluZworICAgIHJldHVybiBzcncKKworZGVmIHRlc3RfdW5pY29kZV9pbnB1dCh1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgdmFsdWUgPSAnICcuam9pbihkYXRhLnNwbGl0KCkpCisgICAgb3V0cHV0ID0geWFtbC5sb2FkKF91bmljb2RlX29wZW4oU3RyaW5nSU8uU3RyaW5nSU8oZGF0YS5lbmNvZGUoJ3V0Zi04JykpLCAndXRmLTgnKSkKKyAgICBhc3NlcnQgb3V0cHV0ID09IHZhbHVlLCAob3V0cHV0LCB2YWx1ZSkKKyAgICBmb3IgaW5wdXQgaW4gW2RhdGEsIGRhdGEuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjgrZGF0YS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfQkUrZGF0YS5lbmNvZGUoJ3V0Zi0xNi1iZScpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjE2X0xFK2RhdGEuZW5jb2RlKCd1dGYtMTYtbGUnKV06CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiSU5QVVQ6IiwgcmVwcihpbnB1dFs6MTBdKSwgIi4uLiIKKyAgICAgICAgb3V0cHV0ID0geWFtbC5sb2FkKGlucHV0KQorICAgICAgICBhc3NlcnQgb3V0cHV0ID09IHZhbHVlLCAob3V0cHV0LCB2YWx1ZSkKKyAgICAgICAgb3V0cHV0ID0geWFtbC5sb2FkKFN0cmluZ0lPLlN0cmluZ0lPKGlucHV0KSkKKyAgICAgICAgYXNzZXJ0IG91dHB1dCA9PSB2YWx1ZSwgKG91dHB1dCwgdmFsdWUpCisKK3Rlc3RfdW5pY29kZV9pbnB1dC51bml0dGVzdCA9IFsnLnVuaWNvZGUnXQorCitkZWYgdGVzdF91bmljb2RlX2lucHV0X2Vycm9ycyh1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgZm9yIGlucHV0IGluIFtkYXRhLmVuY29kZSgnbGF0aW4xJywgJ2lnbm9yZScpLAorICAgICAgICAgICAgICAgICAgICBkYXRhLmVuY29kZSgndXRmLTE2LWJlJyksIGRhdGEuZW5jb2RlKCd1dGYtMTYtbGUnKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNzLkJPTV9VVEY4K2RhdGEuZW5jb2RlKCd1dGYtMTYtYmUnKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYxNl9CRStkYXRhLmVuY29kZSgndXRmLTE2LWxlJyksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfTEUrZGF0YS5lbmNvZGUoJ3V0Zi04JykrJyEnXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWFtbC5sb2FkKGlucHV0KQorICAgICAgICBleGNlcHQgeWFtbC5ZQU1MRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgZXhjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWFtbC5sb2FkKFN0cmluZ0lPLlN0cmluZ0lPKGlucHV0KSkKKyAgICAgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yLCBleGM6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGV4YworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfdW5pY29kZV9pbnB1dF9lcnJvcnMudW5pdHRlc3QgPSBbJy51bmljb2RlJ10KKworZGVmIHRlc3RfdW5pY29kZV9vdXRwdXQodW5pY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZGF0YSA9IG9wZW4odW5pY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLmRlY29kZSgndXRmLTgnKQorICAgIHZhbHVlID0gJyAnLmpvaW4oZGF0YS5zcGxpdCgpKQorICAgIGZvciBhbGxvd191bmljb2RlIGluIFtGYWxzZSwgVHJ1ZV06CisgICAgICAgIGRhdGExID0geWFtbC5kdW1wKHZhbHVlLCBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBbTm9uZSwgJ3V0Zi04JywgJ3V0Zi0xNi1iZScsICd1dGYtMTYtbGUnXToKKyAgICAgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHlhbWwuZHVtcCh2YWx1ZSwgX3VuaWNvZGVfb3BlbihzdHJlYW0sICd1dGYtOCcpLCBlbmNvZGluZz1lbmNvZGluZywgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlKQorICAgICAgICAgICAgZGF0YTIgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgZGF0YTMgPSB5YW1sLmR1bXAodmFsdWUsIGVuY29kaW5nPWVuY29kaW5nLCBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUpCisgICAgICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICB5YW1sLmR1bXAodmFsdWUsIHN0cmVhbSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSkKKyAgICAgICAgICAgIGRhdGE0ID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGZvciBjb3B5IGluIFtkYXRhMSwgZGF0YTIsIGRhdGEzLCBkYXRhNF06CisgICAgICAgICAgICAgICAgaWYgYWxsb3dfdW5pY29kZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY29weVs0Ol0uZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoVW5pY29kZURlY29kZUVycm9yLCBVbmljb2RlRW5jb2RlRXJyb3IpLCBleGM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGV4YworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29weVs0Ol0uZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhMSwgc3RyKSwgKHR5cGUoZGF0YTEpLCBlbmNvZGluZykKKyAgICAgICAgICAgIGRhdGExLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YTIsIHN0ciksICh0eXBlKGRhdGEyKSwgZW5jb2RpbmcpCisgICAgICAgICAgICBkYXRhMi5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YTMsIHVuaWNvZGUpLCAodHlwZShkYXRhMyksIGVuY29kaW5nKQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGE0LCB1bmljb2RlKSwgKHR5cGUoZGF0YTQpLCBlbmNvZGluZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YTMsIHN0ciksICh0eXBlKGRhdGEzKSwgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgZGF0YTMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGE0LCBzdHIpLCAodHlwZShkYXRhNCksIGVuY29kaW5nKQorICAgICAgICAgICAgICAgIGRhdGE0LmRlY29kZShlbmNvZGluZykKKwordGVzdF91bmljb2RlX291dHB1dC51bml0dGVzdCA9IFsnLnVuaWNvZGUnXQorCitkZWYgdGVzdF9maWxlX291dHB1dCh1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgaGFuZGxlLCBmaWxlbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIG9zLmNsb3NlKGhhbmRsZSkKKyAgICB0cnk6CisgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgeWFtbC5kdW1wKGRhdGEsIHN0cmVhbSwgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBkYXRhMSA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHN0cmVhbSA9IG9wZW4oZmlsZW5hbWUsICd3YicpCisgICAgICAgIHlhbWwuZHVtcChkYXRhLCBzdHJlYW0sIGFsbG93X3VuaWNvZGU9VHJ1ZSkKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgZGF0YTIgPSBvcGVuKGZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICAgICAgc3RyZWFtID0gb3BlbihmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgeWFtbC5kdW1wKGRhdGEsIHN0cmVhbSwgZW5jb2Rpbmc9J3V0Zi0xNi1sZScsIGFsbG93X3VuaWNvZGU9VHJ1ZSkKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgZGF0YTMgPSBvcGVuKGZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtMTYtbGUnKVsxOl0uZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHN0cmVhbSA9IF91bmljb2RlX29wZW4ob3BlbihmaWxlbmFtZSwgJ3diJyksICd1dGYtOCcpCisgICAgICAgIHlhbWwuZHVtcChkYXRhLCBzdHJlYW0sIGFsbG93X3VuaWNvZGU9VHJ1ZSkKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgZGF0YTQgPSBvcGVuKGZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICAgICAgYXNzZXJ0IGRhdGExID09IGRhdGEyLCAoZGF0YTEsIGRhdGEyKQorICAgICAgICBhc3NlcnQgZGF0YTEgPT0gZGF0YTMsIChkYXRhMSwgZGF0YTMpCisgICAgICAgIGFzc2VydCBkYXRhMSA9PSBkYXRhNCwgKGRhdGExLCBkYXRhNCkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisKK3Rlc3RfZmlsZV9vdXRwdXQudW5pdHRlc3QgPSBbJy51bmljb2RlJ10KKworZGVmIHRlc3RfdW5pY29kZV90cmFuc2Zlcih1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgZm9yIGVuY29kaW5nIGluIFtOb25lLCAndXRmLTgnLCAndXRmLTE2LWJlJywgJ3V0Zi0xNi1sZSddOgorICAgICAgICBpbnB1dCA9IGRhdGEKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbnB1dCA9ICh1J1x1ZmVmZicraW5wdXQpLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgb3V0cHV0MSA9IHlhbWwuZW1pdCh5YW1sLnBhcnNlKGlucHV0KSwgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHlhbWwuZW1pdCh5YW1sLnBhcnNlKGlucHV0KSwgX3VuaWNvZGVfb3BlbihzdHJlYW0sICd1dGYtOCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9VHJ1ZSkKKyAgICAgICAgb3V0cHV0MiA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXQxLCB1bmljb2RlKSwgKHR5cGUob3V0cHV0MSksIGVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3V0cHV0MSwgc3RyKSwgKHR5cGUob3V0cHV0MSksIGVuY29kaW5nKQorICAgICAgICAgICAgb3V0cHV0MS5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG91dHB1dDIsIHN0ciksICh0eXBlKG91dHB1dDIpLCBlbmNvZGluZykKKyAgICAgICAgb3V0cHV0Mi5kZWNvZGUoJ3V0Zi04JykKKwordGVzdF91bmljb2RlX3RyYW5zZmVyLnVuaXR0ZXN0ID0gWycudW5pY29kZSddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL3Rlc3RfbWFyay5weSBiL3Rlc3RzL2xpYi90ZXN0X21hcmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwYTEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X21hcmsucHkKQEAgLTAsMCArMSwzMiBAQAorCitpbXBvcnQgeWFtbAorCitkZWYgdGVzdF9tYXJrcyhtYXJrc19maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgaW5wdXRzID0gb3BlbihtYXJrc19maWxlbmFtZSwgJ3JiJykucmVhZCgpLnNwbGl0KCctLS1cbicpWzE6XQorICAgIGZvciBpbnB1dCBpbiBpbnB1dHM6CisgICAgICAgIGluZGV4ID0gMAorICAgICAgICBsaW5lID0gMAorICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgIHdoaWxlIGlucHV0W2luZGV4XSAhPSAnKic6CisgICAgICAgICAgICBpZiBpbnB1dFtpbmRleF0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBsaW5lICs9IDEKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbHVtbiArPSAxCisgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgIG1hcmsgPSB5YW1sLk1hcmsobWFya3NfZmlsZW5hbWUsIGluZGV4LCBsaW5lLCBjb2x1bW4sIHVuaWNvZGUoaW5wdXQpLCBpbmRleCkKKyAgICAgICAgc25pcHBldCA9IG1hcmsuZ2V0X3NuaXBwZXQoaW5kZW50PTIsIG1heF9sZW5ndGg9NzkpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBzbmlwcGV0CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHNuaXBwZXQsIHN0ciksIHR5cGUoc25pcHBldCkKKyAgICAgICAgYXNzZXJ0IHNuaXBwZXQuY291bnQoJ1xuJykgPT0gMSwgc25pcHBldC5jb3VudCgnXG4nKQorICAgICAgICBkYXRhLCBwb2ludGVyID0gc25pcHBldC5zcGxpdCgnXG4nKQorICAgICAgICBhc3NlcnQgbGVuKGRhdGEpIDwgODIsIGxlbihkYXRhKQorICAgICAgICBhc3NlcnQgZGF0YVtsZW4ocG9pbnRlciktMV0gPT0gJyonLCBkYXRhW2xlbihwb2ludGVyKS0xXQorCit0ZXN0X21hcmtzLnVuaXR0ZXN0ID0gWycubWFya3MnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X3JlYWRlci5weSBiL3Rlc3RzL2xpYi90ZXN0X3JlYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc2YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfcmVhZGVyLnB5CkBAIC0wLDAgKzEsMzUgQEAKKworaW1wb3J0IHlhbWwucmVhZGVyCitpbXBvcnQgY29kZWNzCisKK2RlZiBfcnVuX3JlYWRlcihkYXRhLCB2ZXJib3NlKToKKyAgICB0cnk6CisgICAgICAgIHN0cmVhbSA9IHlhbWwucmVhZGVyLlJlYWRlcihkYXRhKQorICAgICAgICB3aGlsZSBzdHJlYW0ucGVlaygpICE9IHUnXDAnOgorICAgICAgICAgICAgc3RyZWFtLmZvcndhcmQoKQorICAgIGV4Y2VwdCB5YW1sLnJlYWRlci5SZWFkZXJFcnJvciwgZXhjOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgZXhjCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK2RlZiB0ZXN0X3N0cmVhbV9lcnJvcihlcnJvcl9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX3J1bl9yZWFkZXIob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJyksIHZlcmJvc2UpCisgICAgX3J1bl9yZWFkZXIob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorICAgIGZvciBlbmNvZGluZyBpbiBbJ3V0Zi04JywgJ3V0Zi0xNi1sZScsICd1dGYtMTYtYmUnXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHVuaWNvZGUob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCBlbmNvZGluZykKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgX3J1bl9yZWFkZXIoZGF0YSwgdmVyYm9zZSkKKyAgICBfcnVuX3JlYWRlcihjb2RlY3Mub3BlbihlcnJvcl9maWxlbmFtZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpLCB2ZXJib3NlKQorCit0ZXN0X3N0cmVhbV9lcnJvci51bml0dGVzdCA9IFsnLnN0cmVhbS1lcnJvciddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL3Rlc3RfcmVjdXJzaXZlLnB5IGIvdGVzdHMvbGliL3Rlc3RfcmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDdmZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvdGVzdF9yZWN1cnNpdmUucHkKQEAgLTAsMCArMSw1MCBAQAorCitpbXBvcnQgeWFtbAorCitjbGFzcyBBbkluc3RhbmNlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbywgYmFyKToKKyAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgc2VsZi5iYXIgPSBiYXIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuICIlcyhmb289JXIsIGJhcj0lcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvbywgc2VsZi5iYXIpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIiVzKGZvbz0uLi4sIGJhcj0uLi4pIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKK2NsYXNzIEFuSW5zdGFuY2VXaXRoU3RhdGUoQW5JbnN0YW5jZSk6CisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4geydhdHRyaWJ1dGVzJzogW3NlbGYuZm9vLCBzZWxmLmJhcl19CisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5mb28sIHNlbGYuYmFyID0gc3RhdGVbJ2F0dHJpYnV0ZXMnXQorCitkZWYgdGVzdF9yZWN1cnNpdmUocmVjdXJzaXZlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBleGVjIG9wZW4ocmVjdXJzaXZlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICB2YWx1ZTEgPSB2YWx1ZQorICAgIG91dHB1dDEgPSBOb25lCisgICAgdmFsdWUyID0gTm9uZQorICAgIG91dHB1dDIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBvdXRwdXQxID0geWFtbC5kdW1wKHZhbHVlMSkKKyAgICAgICAgdmFsdWUyID0geWFtbC5sb2FkKG91dHB1dDEpCisgICAgICAgIG91dHB1dDIgPSB5YW1sLmR1bXAodmFsdWUyKQorICAgICAgICBhc3NlcnQgb3V0cHV0MSA9PSBvdXRwdXQyLCAob3V0cHV0MSwgb3V0cHV0MikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgI3ByaW50ICJWQUxVRTE6IiwgdmFsdWUxCisgICAgICAgICAgICAjcHJpbnQgIlZBTFVFMjoiLCB2YWx1ZTIKKyAgICAgICAgICAgIHByaW50ICJPVVRQVVQxOiIKKyAgICAgICAgICAgIHByaW50IG91dHB1dDEKKyAgICAgICAgICAgIHByaW50ICJPVVRQVVQyOiIKKyAgICAgICAgICAgIHByaW50IG91dHB1dDIKKwordGVzdF9yZWN1cnNpdmUudW5pdHRlc3QgPSBbJy5yZWN1cnNpdmUnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X3JlcHJlc2VudGVyLnB5IGIvdGVzdHMvbGliL3Rlc3RfcmVwcmVzZW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyYTMyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X3JlcHJlc2VudGVyLnB5CkBAIC0wLDAgKzEsNDMgQEAKKworaW1wb3J0IHlhbWwKK2ltcG9ydCB0ZXN0X2NvbnN0cnVjdG9yCitpbXBvcnQgcHByaW50CisKK2RlZiB0ZXN0X3JlcHJlc2VudGVyX3R5cGVzKGNvZGVfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIHRlc3RfY29uc3RydWN0b3IuX21ha2Vfb2JqZWN0cygpCisgICAgZm9yIGFsbG93X3VuaWNvZGUgaW4gW0ZhbHNlLCBUcnVlXToKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIFsndXRmLTgnLCAndXRmLTE2LWJlJywgJ3V0Zi0xNi1sZSddOgorICAgICAgICAgICAgbmF0aXZlMSA9IHRlc3RfY29uc3RydWN0b3IuX2xvYWRfY29kZShvcGVuKGNvZGVfZmlsZW5hbWUsICdyYicpLnJlYWQoKSkKKyAgICAgICAgICAgIG5hdGl2ZTIgPSBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0geWFtbC5kdW1wKG5hdGl2ZTEsIER1bXBlcj10ZXN0X2NvbnN0cnVjdG9yLk15RHVtcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgbmF0aXZlMiA9IHlhbWwubG9hZChvdXRwdXQsIExvYWRlcj10ZXN0X2NvbnN0cnVjdG9yLk15TG9hZGVyKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbmF0aXZlMSA9PSBuYXRpdmUyOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdmFsdWUxID0gdGVzdF9jb25zdHJ1Y3Rvci5fc2VyaWFsaXplX3ZhbHVlKG5hdGl2ZTEpCisgICAgICAgICAgICAgICAgdmFsdWUyID0gdGVzdF9jb25zdHJ1Y3Rvci5fc2VyaWFsaXplX3ZhbHVlKG5hdGl2ZTIpCisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlNFUklBTElaRUQgTkFUSVZFMToiCisgICAgICAgICAgICAgICAgICAgIHByaW50IHZhbHVlMQorICAgICAgICAgICAgICAgICAgICBwcmludCAiU0VSSUFMSVpFRCBOQVRJVkUyOiIKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgdmFsdWUyCisgICAgICAgICAgICAgICAgYXNzZXJ0IHZhbHVlMSA9PSB2YWx1ZTIsIChuYXRpdmUxLCBuYXRpdmUyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiTkFUSVZFMToiCisgICAgICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQobmF0aXZlMSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIk5BVElWRTI6IgorICAgICAgICAgICAgICAgICAgICBwcHJpbnQucHByaW50KG5hdGl2ZTIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ICJPVVRQVVQ6IgorICAgICAgICAgICAgICAgICAgICBwcmludCBvdXRwdXQKKwordGVzdF9yZXByZXNlbnRlcl90eXBlcy51bml0dGVzdCA9IFsnLmNvZGUnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X3Jlc29sdmVyLnB5IGIvdGVzdHMvbGliL3Rlc3RfcmVzb2x2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2Njc1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X3Jlc29sdmVyLnB5CkBAIC0wLDAgKzEsOTIgQEAKKworaW1wb3J0IHlhbWwKK2ltcG9ydCBwcHJpbnQKKworZGVmIHRlc3RfaW1wbGljaXRfcmVzb2x2ZXIoZGF0YV9maWxlbmFtZSwgZGV0ZWN0X2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBjb3JyZWN0X3RhZyA9IE5vbmUKKyAgICBub2RlID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgY29ycmVjdF90YWcgPSBvcGVuKGRldGVjdF9maWxlbmFtZSwgJ3JiJykucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgbm9kZSA9IHlhbWwuY29tcG9zZShvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShub2RlLCB5YW1sLlNlcXVlbmNlTm9kZSksIG5vZGUKKyAgICAgICAgZm9yIHNjYWxhciBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoc2NhbGFyLCB5YW1sLlNjYWxhck5vZGUpLCBzY2FsYXIKKyAgICAgICAgICAgIGFzc2VydCBzY2FsYXIudGFnID09IGNvcnJlY3RfdGFnLCAoc2NhbGFyLnRhZywgY29ycmVjdF90YWcpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJDT1JSRUNUIFRBRzoiLCBjb3JyZWN0X3RhZworICAgICAgICAgICAgaWYgaGFzYXR0cihub2RlLCAndmFsdWUnKToKKyAgICAgICAgICAgICAgICBwcmludCAiQ0hJTERSRU46IgorICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQobm9kZS52YWx1ZSkKKwordGVzdF9pbXBsaWNpdF9yZXNvbHZlci51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmRldGVjdCddCisKK2RlZiBfbWFrZV9wYXRoX2xvYWRlcl9hbmRfZHVtcGVyKCk6CisgICAgZ2xvYmFsIE15TG9hZGVyLCBNeUR1bXBlcgorCisgICAgY2xhc3MgTXlMb2FkZXIoeWFtbC5Mb2FkZXIpOgorICAgICAgICBwYXNzCisgICAgY2xhc3MgTXlEdW1wZXIoeWFtbC5EdW1wZXIpOgorICAgICAgICBwYXNzCisKKyAgICB5YW1sLmFkZF9wYXRoX3Jlc29sdmVyKHUnIXJvb3QnLCBbXSwKKyAgICAgICAgICAgIExvYWRlcj1NeUxvYWRlciwgRHVtcGVyPU15RHVtcGVyKQorICAgIHlhbWwuYWRkX3BhdGhfcmVzb2x2ZXIodSchcm9vdC9zY2FsYXInLCBbXSwgc3RyLAorICAgICAgICAgICAgTG9hZGVyPU15TG9hZGVyLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgeWFtbC5hZGRfcGF0aF9yZXNvbHZlcih1JyFyb290L2tleTExL2tleTEyLyonLCBbJ2tleTExJywgJ2tleTEyJ10sCisgICAgICAgICAgICBMb2FkZXI9TXlMb2FkZXIsIER1bXBlcj1NeUR1bXBlcikKKyAgICB5YW1sLmFkZF9wYXRoX3Jlc29sdmVyKHUnIXJvb3Qva2V5MjEvMS8qJywgWydrZXkyMScsIDFdLAorICAgICAgICAgICAgTG9hZGVyPU15TG9hZGVyLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgeWFtbC5hZGRfcGF0aF9yZXNvbHZlcih1JyFyb290L2tleTMxLyovKi9rZXkxNC9tYXAnLCBbJ2tleTMxJywgTm9uZSwgTm9uZSwgJ2tleTE0J10sIGRpY3QsCisgICAgICAgICAgICBMb2FkZXI9TXlMb2FkZXIsIER1bXBlcj1NeUR1bXBlcikKKworICAgIHJldHVybiBNeUxvYWRlciwgTXlEdW1wZXIKKworZGVmIF9jb252ZXJ0X25vZGUobm9kZSk6CisgICAgaWYgaXNpbnN0YW5jZShub2RlLCB5YW1sLlNjYWxhck5vZGUpOgorICAgICAgICByZXR1cm4gKG5vZGUudGFnLCBub2RlLnZhbHVlKQorICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCB5YW1sLlNlcXVlbmNlTm9kZSk6CisgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gbm9kZS52YWx1ZToKKyAgICAgICAgICAgIHZhbHVlLmFwcGVuZChfY29udmVydF9ub2RlKGl0ZW0pKQorICAgICAgICByZXR1cm4gKG5vZGUudGFnLCB2YWx1ZSkKKyAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgeWFtbC5NYXBwaW5nTm9kZSk6CisgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgZm9yIGtleSwgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgdmFsdWUuYXBwZW5kKChfY29udmVydF9ub2RlKGtleSksIF9jb252ZXJ0X25vZGUoaXRlbSkpKQorICAgICAgICByZXR1cm4gKG5vZGUudGFnLCB2YWx1ZSkKKworZGVmIHRlc3RfcGF0aF9yZXNvbHZlcl9sb2FkZXIoZGF0YV9maWxlbmFtZSwgcGF0aF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2VfcGF0aF9sb2FkZXJfYW5kX2R1bXBlcigpCisgICAgbm9kZXMxID0gbGlzdCh5YW1sLmNvbXBvc2VfYWxsKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCBMb2FkZXI9TXlMb2FkZXIpKQorICAgIG5vZGVzMiA9IGxpc3QoeWFtbC5jb21wb3NlX2FsbChvcGVuKHBhdGhfZmlsZW5hbWUsICdyYicpLnJlYWQoKSkpCisgICAgdHJ5OgorICAgICAgICBmb3Igbm9kZTEsIG5vZGUyIGluIHppcChub2RlczEsIG5vZGVzMik6CisgICAgICAgICAgICBkYXRhMSA9IF9jb252ZXJ0X25vZGUobm9kZTEpCisgICAgICAgICAgICBkYXRhMiA9IF9jb252ZXJ0X25vZGUobm9kZTIpCisgICAgICAgICAgICBhc3NlcnQgZGF0YTEgPT0gZGF0YTIsIChkYXRhMSwgZGF0YTIpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHlhbWwuc2VyaWFsaXplX2FsbChub2RlczEpCisKK3Rlc3RfcGF0aF9yZXNvbHZlcl9sb2FkZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5wYXRoJ10KKworZGVmIHRlc3RfcGF0aF9yZXNvbHZlcl9kdW1wZXIoZGF0YV9maWxlbmFtZSwgcGF0aF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2VfcGF0aF9sb2FkZXJfYW5kX2R1bXBlcigpCisgICAgZm9yIGZpbGVuYW1lIGluIFtkYXRhX2ZpbGVuYW1lLCBwYXRoX2ZpbGVuYW1lXToKKyAgICAgICAgb3V0cHV0ID0geWFtbC5zZXJpYWxpemVfYWxsKHlhbWwuY29tcG9zZV9hbGwob3BlbihmaWxlbmFtZSwgJ3JiJykpLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBvdXRwdXQKKyAgICAgICAgbm9kZXMxID0geWFtbC5jb21wb3NlX2FsbChvdXRwdXQpCisgICAgICAgIG5vZGVzMiA9IHlhbWwuY29tcG9zZV9hbGwob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKSkKKyAgICAgICAgZm9yIG5vZGUxLCBub2RlMiBpbiB6aXAobm9kZXMxLCBub2RlczIpOgorICAgICAgICAgICAgZGF0YTEgPSBfY29udmVydF9ub2RlKG5vZGUxKQorICAgICAgICAgICAgZGF0YTIgPSBfY29udmVydF9ub2RlKG5vZGUyKQorICAgICAgICAgICAgYXNzZXJ0IGRhdGExID09IGRhdGEyLCAoZGF0YTEsIGRhdGEyKQorCit0ZXN0X3BhdGhfcmVzb2x2ZXJfZHVtcGVyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcucGF0aCddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL3Rlc3Rfc3RydWN0dXJlLnB5IGIvdGVzdHMvbGliL3Rlc3Rfc3RydWN0dXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmNiODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvdGVzdF9zdHJ1Y3R1cmUucHkKQEAgLTAsMCArMSwxODcgQEAKKworaW1wb3J0IHlhbWwsIGNhbm9uaWNhbAoraW1wb3J0IHBwcmludAorCitkZWYgX2NvbnZlcnRfc3RydWN0dXJlKGxvYWRlcik6CisgICAgaWYgbG9hZGVyLmNoZWNrX2V2ZW50KHlhbWwuU2NhbGFyRXZlbnQpOgorICAgICAgICBldmVudCA9IGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICBpZiBldmVudC50YWcgb3IgZXZlbnQuYW5jaG9yIG9yIGV2ZW50LnZhbHVlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgZWxpZiBsb2FkZXIuY2hlY2tfZXZlbnQoeWFtbC5TZXF1ZW5jZVN0YXJ0RXZlbnQpOgorICAgICAgICBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICAgICAgc2VxdWVuY2UgPSBbXQorICAgICAgICB3aGlsZSBub3QgbG9hZGVyLmNoZWNrX2V2ZW50KHlhbWwuU2VxdWVuY2VFbmRFdmVudCk6CisgICAgICAgICAgICBzZXF1ZW5jZS5hcHBlbmQoX2NvbnZlcnRfc3RydWN0dXJlKGxvYWRlcikpCisgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICByZXR1cm4gc2VxdWVuY2UKKyAgICBlbGlmIGxvYWRlci5jaGVja19ldmVudCh5YW1sLk1hcHBpbmdTdGFydEV2ZW50KToKKyAgICAgICAgbG9hZGVyLmdldF9ldmVudCgpCisgICAgICAgIG1hcHBpbmcgPSBbXQorICAgICAgICB3aGlsZSBub3QgbG9hZGVyLmNoZWNrX2V2ZW50KHlhbWwuTWFwcGluZ0VuZEV2ZW50KToKKyAgICAgICAgICAgIGtleSA9IF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpCisgICAgICAgICAgICB2YWx1ZSA9IF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpCisgICAgICAgICAgICBtYXBwaW5nLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICByZXR1cm4gbWFwcGluZworICAgIGVsaWYgbG9hZGVyLmNoZWNrX2V2ZW50KHlhbWwuQWxpYXNFdmVudCk6CisgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICByZXR1cm4gJyonCisgICAgZWxzZToKKyAgICAgICAgbG9hZGVyLmdldF9ldmVudCgpCisgICAgICAgIHJldHVybiAnPycKKworZGVmIHRlc3Rfc3RydWN0dXJlKGRhdGFfZmlsZW5hbWUsIHN0cnVjdHVyZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgbm9kZXMxID0gW10KKyAgICBub2RlczIgPSBldmFsKG9wZW4oc3RydWN0dXJlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkpCisgICAgdHJ5OgorICAgICAgICBsb2FkZXIgPSB5YW1sLkxvYWRlcihvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKQorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfZXZlbnQoKToKKyAgICAgICAgICAgIGlmIGxvYWRlci5jaGVja19ldmVudCh5YW1sLlN0cmVhbVN0YXJ0RXZlbnQsIHlhbWwuU3RyZWFtRW5kRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhbWwuRG9jdW1lbnRTdGFydEV2ZW50LCB5YW1sLkRvY3VtZW50RW5kRXZlbnQpOgorICAgICAgICAgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBub2RlczEuYXBwZW5kKF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpKQorICAgICAgICBpZiBsZW4obm9kZXMxKSA9PSAxOgorICAgICAgICAgICAgbm9kZXMxID0gbm9kZXMxWzBdCisgICAgICAgIGFzc2VydCBub2RlczEgPT0gbm9kZXMyLCAobm9kZXMxLCBub2RlczIpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJOT0RFUzE6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChub2RlczEpCisgICAgICAgICAgICBwcmludCAiTk9ERVMyOiIKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQobm9kZXMyKQorCit0ZXN0X3N0cnVjdHVyZS51bml0dGVzdCA9IFsnLmRhdGEnLCAnLnN0cnVjdHVyZSddCisKK2RlZiBfY29tcGFyZV9ldmVudHMoZXZlbnRzMSwgZXZlbnRzMiwgZnVsbD1GYWxzZSk6CisgICAgYXNzZXJ0IGxlbihldmVudHMxKSA9PSBsZW4oZXZlbnRzMiksIChsZW4oZXZlbnRzMSksIGxlbihldmVudHMyKSkKKyAgICBmb3IgZXZlbnQxLCBldmVudDIgaW4gemlwKGV2ZW50czEsIGV2ZW50czIpOgorICAgICAgICBhc3NlcnQgZXZlbnQxLl9fY2xhc3NfXyA9PSBldmVudDIuX19jbGFzc19fLCAoZXZlbnQxLCBldmVudDIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQxLCB5YW1sLkFsaWFzRXZlbnQpIGFuZCBmdWxsOgorICAgICAgICAgICAgYXNzZXJ0IGV2ZW50MS5hbmNob3IgPT0gZXZlbnQyLmFuY2hvciwgKGV2ZW50MSwgZXZlbnQyKQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50MSwgKHlhbWwuU2NhbGFyRXZlbnQsIHlhbWwuQ29sbGVjdGlvblN0YXJ0RXZlbnQpKToKKyAgICAgICAgICAgIGlmIChldmVudDEudGFnIG5vdCBpbiBbTm9uZSwgdSchJ10gYW5kIGV2ZW50Mi50YWcgbm90IGluIFtOb25lLCB1JyEnXSkgb3IgZnVsbDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgZXZlbnQxLnRhZyA9PSBldmVudDIudGFnLCAoZXZlbnQxLCBldmVudDIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQxLCB5YW1sLlNjYWxhckV2ZW50KToKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEudmFsdWUgPT0gZXZlbnQyLnZhbHVlLCAoZXZlbnQxLCBldmVudDIpCisKK2RlZiB0ZXN0X3BhcnNlcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50czEgPSBOb25lCisgICAgZXZlbnRzMiA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGV2ZW50czEgPSBsaXN0KHlhbWwucGFyc2Uob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIGV2ZW50czIgPSBsaXN0KHlhbWwuY2Fub25pY2FsX3BhcnNlKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIF9jb21wYXJlX2V2ZW50cyhldmVudHMxLCBldmVudHMyKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiRVZFTlRTMToiCisgICAgICAgICAgICBwcHJpbnQucHByaW50KGV2ZW50czEpCisgICAgICAgICAgICBwcmludCAiRVZFTlRTMjoiCisgICAgICAgICAgICBwcHJpbnQucHByaW50KGV2ZW50czIpCisKK3Rlc3RfcGFyc2VyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KKworZGVmIHRlc3RfcGFyc2VyX29uX2Nhbm9uaWNhbChjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50czEgPSBOb25lCisgICAgZXZlbnRzMiA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGV2ZW50czEgPSBsaXN0KHlhbWwucGFyc2Uob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpKSkKKyAgICAgICAgZXZlbnRzMiA9IGxpc3QoeWFtbC5jYW5vbmljYWxfcGFyc2Uob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpKSkKKyAgICAgICAgX2NvbXBhcmVfZXZlbnRzKGV2ZW50czEsIGV2ZW50czIsIGZ1bGw9VHJ1ZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIkVWRU5UUzE6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChldmVudHMxKQorICAgICAgICAgICAgcHJpbnQgIkVWRU5UUzI6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChldmVudHMyKQorCit0ZXN0X3BhcnNlcl9vbl9jYW5vbmljYWwudW5pdHRlc3QgPSBbJy5jYW5vbmljYWwnXQorCitkZWYgX2NvbXBhcmVfbm9kZXMobm9kZTEsIG5vZGUyKToKKyAgICBhc3NlcnQgbm9kZTEuX19jbGFzc19fID09IG5vZGUyLl9fY2xhc3NfXywgKG5vZGUxLCBub2RlMikKKyAgICBhc3NlcnQgbm9kZTEudGFnID09IG5vZGUyLnRhZywgKG5vZGUxLCBub2RlMikKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUxLCB5YW1sLlNjYWxhck5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZTEudmFsdWUgPT0gbm9kZTIudmFsdWUsIChub2RlMSwgbm9kZTIpCisgICAgZWxzZToKKyAgICAgICAgYXNzZXJ0IGxlbihub2RlMS52YWx1ZSkgPT0gbGVuKG5vZGUyLnZhbHVlKSwgKG5vZGUxLCBub2RlMikKKyAgICAgICAgZm9yIGl0ZW0xLCBpdGVtMiBpbiB6aXAobm9kZTEudmFsdWUsIG5vZGUyLnZhbHVlKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0xLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgaXRlbTEgPSAoaXRlbTEsKQorICAgICAgICAgICAgICAgIGl0ZW0yID0gKGl0ZW0yLCkKKyAgICAgICAgICAgIGZvciBzdWJub2RlMSwgc3Vibm9kZTIgaW4gemlwKGl0ZW0xLCBpdGVtMik6CisgICAgICAgICAgICAgICAgX2NvbXBhcmVfbm9kZXMoc3Vibm9kZTEsIHN1Ym5vZGUyKQorCitkZWYgdGVzdF9jb21wb3NlcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIG5vZGVzMSA9IE5vbmUKKyAgICBub2RlczIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBub2RlczEgPSBsaXN0KHlhbWwuY29tcG9zZV9hbGwob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIG5vZGVzMiA9IGxpc3QoeWFtbC5jYW5vbmljYWxfY29tcG9zZV9hbGwob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpKSkKKyAgICAgICAgYXNzZXJ0IGxlbihub2RlczEpID09IGxlbihub2RlczIpLCAobGVuKG5vZGVzMSksIGxlbihub2RlczIpKQorICAgICAgICBmb3Igbm9kZTEsIG5vZGUyIGluIHppcChub2RlczEsIG5vZGVzMik6CisgICAgICAgICAgICBfY29tcGFyZV9ub2Rlcyhub2RlMSwgbm9kZTIpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJOT0RFUzE6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChub2RlczEpCisgICAgICAgICAgICBwcmludCAiTk9ERVMyOiIKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQobm9kZXMyKQorCit0ZXN0X2NvbXBvc2VyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KKworZGVmIF9tYWtlX2xvYWRlcigpOgorICAgIGdsb2JhbCBNeUxvYWRlcgorCisgICAgY2xhc3MgTXlMb2FkZXIoeWFtbC5Mb2FkZXIpOgorICAgICAgICBkZWYgY29uc3RydWN0X3NlcXVlbmNlKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHlhbWwuTG9hZGVyLmNvbnN0cnVjdF9zZXF1ZW5jZShzZWxmLCBub2RlKSkKKyAgICAgICAgZGVmIGNvbnN0cnVjdF9tYXBwaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcGFpcnMgPSBzZWxmLmNvbnN0cnVjdF9wYWlycyhub2RlKQorICAgICAgICAgICAgcGFpcnMuc29ydCgpCisgICAgICAgICAgICByZXR1cm4gcGFpcnMKKyAgICAgICAgZGVmIGNvbnN0cnVjdF91bmRlZmluZWQoc2VsZiwgbm9kZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3Rfc2NhbGFyKG5vZGUpCisKKyAgICBNeUxvYWRlci5hZGRfY29uc3RydWN0b3IodSd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCBNeUxvYWRlci5jb25zdHJ1Y3RfbWFwcGluZykKKyAgICBNeUxvYWRlci5hZGRfY29uc3RydWN0b3IoTm9uZSwgTXlMb2FkZXIuY29uc3RydWN0X3VuZGVmaW5lZCkKKworZGVmIF9tYWtlX2Nhbm9uaWNhbF9sb2FkZXIoKToKKyAgICBnbG9iYWwgTXlDYW5vbmljYWxMb2FkZXIKKworICAgIGNsYXNzIE15Q2Fub25pY2FsTG9hZGVyKHlhbWwuQ2Fub25pY2FsTG9hZGVyKToKKyAgICAgICAgZGVmIGNvbnN0cnVjdF9zZXF1ZW5jZShzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHJldHVybiB0dXBsZSh5YW1sLkNhbm9uaWNhbExvYWRlci5jb25zdHJ1Y3Rfc2VxdWVuY2Uoc2VsZiwgbm9kZSkpCisgICAgICAgIGRlZiBjb25zdHJ1Y3RfbWFwcGluZyhzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHBhaXJzID0gc2VsZi5jb25zdHJ1Y3RfcGFpcnMobm9kZSkKKyAgICAgICAgICAgIHBhaXJzLnNvcnQoKQorICAgICAgICAgICAgcmV0dXJuIHBhaXJzCisgICAgICAgIGRlZiBjb25zdHJ1Y3RfdW5kZWZpbmVkKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorCisgICAgTXlDYW5vbmljYWxMb2FkZXIuYWRkX2NvbnN0cnVjdG9yKHUndGFnOnlhbWwub3JnLDIwMDI6bWFwJywgTXlDYW5vbmljYWxMb2FkZXIuY29uc3RydWN0X21hcHBpbmcpCisgICAgTXlDYW5vbmljYWxMb2FkZXIuYWRkX2NvbnN0cnVjdG9yKE5vbmUsIE15Q2Fub25pY2FsTG9hZGVyLmNvbnN0cnVjdF91bmRlZmluZWQpCisKK2RlZiB0ZXN0X2NvbnN0cnVjdG9yKGRhdGFfZmlsZW5hbWUsIGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2VfbG9hZGVyKCkKKyAgICBfbWFrZV9jYW5vbmljYWxfbG9hZGVyKCkKKyAgICBuYXRpdmUxID0gTm9uZQorICAgIG5hdGl2ZTIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBuYXRpdmUxID0gbGlzdCh5YW1sLmxvYWRfYWxsKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksIExvYWRlcj1NeUxvYWRlcikpCisgICAgICAgIG5hdGl2ZTIgPSBsaXN0KHlhbWwubG9hZF9hbGwob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLCBMb2FkZXI9TXlDYW5vbmljYWxMb2FkZXIpKQorICAgICAgICBhc3NlcnQgbmF0aXZlMSA9PSBuYXRpdmUyLCAobmF0aXZlMSwgbmF0aXZlMikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk5BVElWRTE6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUxKQorICAgICAgICAgICAgcHJpbnQgIk5BVElWRTI6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUyKQorCit0ZXN0X2NvbnN0cnVjdG9yLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4oZ2xvYmFscygpKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIvdGVzdF90b2tlbnMucHkgYi90ZXN0cy9saWIvdGVzdF90b2tlbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxM2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi90ZXN0X3Rva2Vucy5weQpAQCAtMCwwICsxLDc3IEBACisKK2ltcG9ydCB5YW1sCitpbXBvcnQgcHByaW50CisKKyMgVG9rZW5zIG1uZW1vbmljOgorIyBkaXJlY3RpdmU6ICAgICAgICAgICAgJQorIyBkb2N1bWVudF9zdGFydDogICAgICAgLS0tCisjIGRvY3VtZW50X2VuZDogICAgICAgICAuLi4KKyMgYWxpYXM6ICAgICAgICAgICAgICAgICoKKyMgYW5jaG9yOiAgICAgICAgICAgICAgICYKKyMgdGFnOiAgICAgICAgICAgICAgICAgICEKKyMgc2NhbGFyICAgICAgICAgICAgICAgIF8KKyMgYmxvY2tfc2VxdWVuY2Vfc3RhcnQ6IFtbCisjIGJsb2NrX21hcHBpbmdfc3RhcnQ6ICB7eworIyBibG9ja19lbmQ6ICAgICAgICAgICAgXX0KKyMgZmxvd19zZXF1ZW5jZV9zdGFydDogIFsKKyMgZmxvd19zZXF1ZW5jZV9lbmQ6ICAgIF0KKyMgZmxvd19tYXBwaW5nX3N0YXJ0OiAgIHsKKyMgZmxvd19tYXBwaW5nX2VuZDogICAgIH0KKyMgZW50cnk6ICAgICAgICAgICAgICAgICwKKyMga2V5OiAgICAgICAgICAgICAgICAgID8KKyMgdmFsdWU6ICAgICAgICAgICAgICAgIDoKKworX3JlcGxhY2VzID0geworICAgIHlhbWwuRGlyZWN0aXZlVG9rZW46ICclJywKKyAgICB5YW1sLkRvY3VtZW50U3RhcnRUb2tlbjogJy0tLScsCisgICAgeWFtbC5Eb2N1bWVudEVuZFRva2VuOiAnLi4uJywKKyAgICB5YW1sLkFsaWFzVG9rZW46ICcqJywKKyAgICB5YW1sLkFuY2hvclRva2VuOiAnJicsCisgICAgeWFtbC5UYWdUb2tlbjogJyEnLAorICAgIHlhbWwuU2NhbGFyVG9rZW46ICdfJywKKyAgICB5YW1sLkJsb2NrU2VxdWVuY2VTdGFydFRva2VuOiAnW1snLAorICAgIHlhbWwuQmxvY2tNYXBwaW5nU3RhcnRUb2tlbjogJ3t7JywKKyAgICB5YW1sLkJsb2NrRW5kVG9rZW46ICddfScsCisgICAgeWFtbC5GbG93U2VxdWVuY2VTdGFydFRva2VuOiAnWycsCisgICAgeWFtbC5GbG93U2VxdWVuY2VFbmRUb2tlbjogJ10nLAorICAgIHlhbWwuRmxvd01hcHBpbmdTdGFydFRva2VuOiAneycsCisgICAgeWFtbC5GbG93TWFwcGluZ0VuZFRva2VuOiAnfScsCisgICAgeWFtbC5CbG9ja0VudHJ5VG9rZW46ICcsJywKKyAgICB5YW1sLkZsb3dFbnRyeVRva2VuOiAnLCcsCisgICAgeWFtbC5LZXlUb2tlbjogJz8nLAorICAgIHlhbWwuVmFsdWVUb2tlbjogJzonLAorfQorCitkZWYgdGVzdF90b2tlbnMoZGF0YV9maWxlbmFtZSwgdG9rZW5zX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICB0b2tlbnMxID0gW10KKyAgICB0b2tlbnMyID0gb3Blbih0b2tlbnNfZmlsZW5hbWUsICdyYicpLnJlYWQoKS5zcGxpdCgpCisgICAgdHJ5OgorICAgICAgICBmb3IgdG9rZW4gaW4geWFtbC5zY2FuKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodG9rZW4sICh5YW1sLlN0cmVhbVN0YXJ0VG9rZW4sIHlhbWwuU3RyZWFtRW5kVG9rZW4pKToKKyAgICAgICAgICAgICAgICB0b2tlbnMxLmFwcGVuZChfcmVwbGFjZXNbdG9rZW4uX19jbGFzc19fXSkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlRPS0VOUzE6IiwgJyAnLmpvaW4odG9rZW5zMSkKKyAgICAgICAgICAgIHByaW50ICJUT0tFTlMyOiIsICcgJy5qb2luKHRva2VuczIpCisgICAgYXNzZXJ0IGxlbih0b2tlbnMxKSA9PSBsZW4odG9rZW5zMiksICh0b2tlbnMxLCB0b2tlbnMyKQorICAgIGZvciB0b2tlbjEsIHRva2VuMiBpbiB6aXAodG9rZW5zMSwgdG9rZW5zMik6CisgICAgICAgIGFzc2VydCB0b2tlbjEgPT0gdG9rZW4yLCAodG9rZW4xLCB0b2tlbjIpCisKK3Rlc3RfdG9rZW5zLnVuaXR0ZXN0ID0gWycuZGF0YScsICcudG9rZW5zJ10KKworZGVmIHRlc3Rfc2Nhbm5lcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGZvciBmaWxlbmFtZSBpbiBbZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lXToKKyAgICAgICAgdG9rZW5zID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHRva2VuIGluIHlhbWwuc2NhbihvcGVuKGZpbGVuYW1lLCAncmInKSk6CisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0b2tlbi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQodG9rZW5zKQorCit0ZXN0X3NjYW5uZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi90ZXN0X3lhbWwucHkgYi90ZXN0cy9saWIvdGVzdF95YW1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjczNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvdGVzdF95YW1sLnB5CkBAIC0wLDAgKzEsMTggQEAKKworZnJvbSB0ZXN0X21hcmsgaW1wb3J0ICoKK2Zyb20gdGVzdF9yZWFkZXIgaW1wb3J0ICoKK2Zyb20gdGVzdF9jYW5vbmljYWwgaW1wb3J0ICoKK2Zyb20gdGVzdF90b2tlbnMgaW1wb3J0ICoKK2Zyb20gdGVzdF9zdHJ1Y3R1cmUgaW1wb3J0ICoKK2Zyb20gdGVzdF9lcnJvcnMgaW1wb3J0ICoKK2Zyb20gdGVzdF9yZXNvbHZlciBpbXBvcnQgKgorZnJvbSB0ZXN0X2NvbnN0cnVjdG9yIGltcG9ydCAqCitmcm9tIHRlc3RfZW1pdHRlciBpbXBvcnQgKgorZnJvbSB0ZXN0X3JlcHJlc2VudGVyIGltcG9ydCAqCitmcm9tIHRlc3RfcmVjdXJzaXZlIGltcG9ydCAqCitmcm9tIHRlc3RfaW5wdXRfb3V0cHV0IGltcG9ydCAqCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL3Rlc3RfeWFtbF9leHQucHkgYi90ZXN0cy9saWIvdGVzdF95YW1sX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGZkYTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL3Rlc3RfeWFtbF9leHQucHkKQEAgLTAsMCArMSwyNzcgQEAKKworaW1wb3J0IF95YW1sLCB5YW1sCitpbXBvcnQgdHlwZXMsIHBwcmludAorCit5YW1sLlB5QmFzZUxvYWRlciA9IHlhbWwuQmFzZUxvYWRlcgoreWFtbC5QeVNhZmVMb2FkZXIgPSB5YW1sLlNhZmVMb2FkZXIKK3lhbWwuUHlMb2FkZXIgPSB5YW1sLkxvYWRlcgoreWFtbC5QeUJhc2VEdW1wZXIgPSB5YW1sLkJhc2VEdW1wZXIKK3lhbWwuUHlTYWZlRHVtcGVyID0geWFtbC5TYWZlRHVtcGVyCit5YW1sLlB5RHVtcGVyID0geWFtbC5EdW1wZXIKKworb2xkX3NjYW4gPSB5YW1sLnNjYW4KK2RlZiBuZXdfc2NhbihzdHJlYW0sIExvYWRlcj15YW1sLkNMb2FkZXIpOgorICAgIHJldHVybiBvbGRfc2NhbihzdHJlYW0sIExvYWRlcikKKworb2xkX3BhcnNlID0geWFtbC5wYXJzZQorZGVmIG5ld19wYXJzZShzdHJlYW0sIExvYWRlcj15YW1sLkNMb2FkZXIpOgorICAgIHJldHVybiBvbGRfcGFyc2Uoc3RyZWFtLCBMb2FkZXIpCisKK29sZF9jb21wb3NlID0geWFtbC5jb21wb3NlCitkZWYgbmV3X2NvbXBvc2Uoc3RyZWFtLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICByZXR1cm4gb2xkX2NvbXBvc2Uoc3RyZWFtLCBMb2FkZXIpCisKK29sZF9jb21wb3NlX2FsbCA9IHlhbWwuY29tcG9zZV9hbGwKK2RlZiBuZXdfY29tcG9zZV9hbGwoc3RyZWFtLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICByZXR1cm4gb2xkX2NvbXBvc2VfYWxsKHN0cmVhbSwgTG9hZGVyKQorCitvbGRfbG9hZCA9IHlhbWwubG9hZAorZGVmIG5ld19sb2FkKHN0cmVhbSwgTG9hZGVyPXlhbWwuQ0xvYWRlcik6CisgICAgcmV0dXJuIG9sZF9sb2FkKHN0cmVhbSwgTG9hZGVyKQorCitvbGRfbG9hZF9hbGwgPSB5YW1sLmxvYWRfYWxsCitkZWYgbmV3X2xvYWRfYWxsKHN0cmVhbSwgTG9hZGVyPXlhbWwuQ0xvYWRlcik6CisgICAgcmV0dXJuIG9sZF9sb2FkX2FsbChzdHJlYW0sIExvYWRlcikKKworb2xkX3NhZmVfbG9hZCA9IHlhbWwuc2FmZV9sb2FkCitkZWYgbmV3X3NhZmVfbG9hZChzdHJlYW0pOgorICAgIHJldHVybiBvbGRfbG9hZChzdHJlYW0sIHlhbWwuQ1NhZmVMb2FkZXIpCisKK29sZF9zYWZlX2xvYWRfYWxsID0geWFtbC5zYWZlX2xvYWRfYWxsCitkZWYgbmV3X3NhZmVfbG9hZF9hbGwoc3RyZWFtKToKKyAgICByZXR1cm4gb2xkX2xvYWRfYWxsKHN0cmVhbSwgeWFtbC5DU2FmZUxvYWRlcikKKworb2xkX2VtaXQgPSB5YW1sLmVtaXQKK2RlZiBuZXdfZW1pdChldmVudHMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZW1pdChldmVudHMsIHN0cmVhbSwgRHVtcGVyLCAqKmt3ZHMpCisKK29sZF9zZXJpYWxpemUgPSB5YW1sLnNlcmlhbGl6ZQorZGVmIG5ld19zZXJpYWxpemUobm9kZSwgc3RyZWFtLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfc2VyaWFsaXplKG5vZGUsIHN0cmVhbSwgRHVtcGVyLCAqKmt3ZHMpCisKK29sZF9zZXJpYWxpemVfYWxsID0geWFtbC5zZXJpYWxpemVfYWxsCitkZWYgbmV3X3NlcmlhbGl6ZV9hbGwobm9kZXMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfc2VyaWFsaXplX2FsbChub2Rlcywgc3RyZWFtLCBEdW1wZXIsICoqa3dkcykKKworb2xkX2R1bXAgPSB5YW1sLmR1bXAKK2RlZiBuZXdfZHVtcChkYXRhLCBzdHJlYW09Tm9uZSwgRHVtcGVyPXlhbWwuQ0R1bXBlciwgKiprd2RzKToKKyAgICByZXR1cm4gb2xkX2R1bXAoZGF0YSwgc3RyZWFtLCBEdW1wZXIsICoqa3dkcykKKworb2xkX2R1bXBfYWxsID0geWFtbC5kdW1wX2FsbAorZGVmIG5ld19kdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW0sIER1bXBlciwgKiprd2RzKQorCitvbGRfc2FmZV9kdW1wID0geWFtbC5zYWZlX2R1bXAKK2RlZiBuZXdfc2FmZV9kdW1wKGRhdGEsIHN0cmVhbT1Ob25lLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcChkYXRhLCBzdHJlYW0sIHlhbWwuQ1NhZmVEdW1wZXIsICoqa3dkcykKKworb2xkX3NhZmVfZHVtcF9hbGwgPSB5YW1sLnNhZmVfZHVtcF9hbGwKK2RlZiBuZXdfc2FmZV9kdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW0sIHlhbWwuQ1NhZmVEdW1wZXIsICoqa3dkcykKKworZGVmIF9zZXRfdXAoKToKKyAgICB5YW1sLkJhc2VMb2FkZXIgPSB5YW1sLkNCYXNlTG9hZGVyCisgICAgeWFtbC5TYWZlTG9hZGVyID0geWFtbC5DU2FmZUxvYWRlcgorICAgIHlhbWwuTG9hZGVyID0geWFtbC5DTG9hZGVyCisgICAgeWFtbC5CYXNlRHVtcGVyID0geWFtbC5DQmFzZUR1bXBlcgorICAgIHlhbWwuU2FmZUR1bXBlciA9IHlhbWwuQ1NhZmVEdW1wZXIKKyAgICB5YW1sLkR1bXBlciA9IHlhbWwuQ0R1bXBlcgorICAgIHlhbWwuc2NhbiA9IG5ld19zY2FuCisgICAgeWFtbC5wYXJzZSA9IG5ld19wYXJzZQorICAgIHlhbWwuY29tcG9zZSA9IG5ld19jb21wb3NlCisgICAgeWFtbC5jb21wb3NlX2FsbCA9IG5ld19jb21wb3NlX2FsbAorICAgIHlhbWwubG9hZCA9IG5ld19sb2FkCisgICAgeWFtbC5sb2FkX2FsbCA9IG5ld19sb2FkX2FsbAorICAgIHlhbWwuc2FmZV9sb2FkID0gbmV3X3NhZmVfbG9hZAorICAgIHlhbWwuc2FmZV9sb2FkX2FsbCA9IG5ld19zYWZlX2xvYWRfYWxsCisgICAgeWFtbC5lbWl0ID0gbmV3X2VtaXQKKyAgICB5YW1sLnNlcmlhbGl6ZSA9IG5ld19zZXJpYWxpemUKKyAgICB5YW1sLnNlcmlhbGl6ZV9hbGwgPSBuZXdfc2VyaWFsaXplX2FsbAorICAgIHlhbWwuZHVtcCA9IG5ld19kdW1wCisgICAgeWFtbC5kdW1wX2FsbCA9IG5ld19kdW1wX2FsbAorICAgIHlhbWwuc2FmZV9kdW1wID0gbmV3X3NhZmVfZHVtcAorICAgIHlhbWwuc2FmZV9kdW1wX2FsbCA9IG5ld19zYWZlX2R1bXBfYWxsCisKK2RlZiBfdGVhcl9kb3duKCk6CisgICAgeWFtbC5CYXNlTG9hZGVyID0geWFtbC5QeUJhc2VMb2FkZXIKKyAgICB5YW1sLlNhZmVMb2FkZXIgPSB5YW1sLlB5U2FmZUxvYWRlcgorICAgIHlhbWwuTG9hZGVyID0geWFtbC5QeUxvYWRlcgorICAgIHlhbWwuQmFzZUR1bXBlciA9IHlhbWwuUHlCYXNlRHVtcGVyCisgICAgeWFtbC5TYWZlRHVtcGVyID0geWFtbC5QeVNhZmVEdW1wZXIKKyAgICB5YW1sLkR1bXBlciA9IHlhbWwuUHlEdW1wZXIKKyAgICB5YW1sLnNjYW4gPSBvbGRfc2NhbgorICAgIHlhbWwucGFyc2UgPSBvbGRfcGFyc2UKKyAgICB5YW1sLmNvbXBvc2UgPSBvbGRfY29tcG9zZQorICAgIHlhbWwuY29tcG9zZV9hbGwgPSBvbGRfY29tcG9zZV9hbGwKKyAgICB5YW1sLmxvYWQgPSBvbGRfbG9hZAorICAgIHlhbWwubG9hZF9hbGwgPSBvbGRfbG9hZF9hbGwKKyAgICB5YW1sLnNhZmVfbG9hZCA9IG9sZF9zYWZlX2xvYWQKKyAgICB5YW1sLnNhZmVfbG9hZF9hbGwgPSBvbGRfc2FmZV9sb2FkX2FsbAorICAgIHlhbWwuZW1pdCA9IG9sZF9lbWl0CisgICAgeWFtbC5zZXJpYWxpemUgPSBvbGRfc2VyaWFsaXplCisgICAgeWFtbC5zZXJpYWxpemVfYWxsID0gb2xkX3NlcmlhbGl6ZV9hbGwKKyAgICB5YW1sLmR1bXAgPSBvbGRfZHVtcAorICAgIHlhbWwuZHVtcF9hbGwgPSBvbGRfZHVtcF9hbGwKKyAgICB5YW1sLnNhZmVfZHVtcCA9IG9sZF9zYWZlX2R1bXAKKyAgICB5YW1sLnNhZmVfZHVtcF9hbGwgPSBvbGRfc2FmZV9kdW1wX2FsbAorCitkZWYgdGVzdF9jX3ZlcnNpb24odmVyYm9zZT1GYWxzZSk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgX3lhbWwuZ2V0X3ZlcnNpb24oKQorICAgICAgICBwcmludCBfeWFtbC5nZXRfdmVyc2lvbl9zdHJpbmcoKQorICAgIGFzc2VydCAoIiVzLiVzLiVzIiAlIF95YW1sLmdldF92ZXJzaW9uKCkpID09IF95YW1sLmdldF92ZXJzaW9uX3N0cmluZygpLCAgICBcCisgICAgICAgICAgICAoX3lhbWwuZ2V0X3ZlcnNpb24oKSwgX3lhbWwuZ2V0X3ZlcnNpb25fc3RyaW5nKCkpCisKK2RlZiBfY29tcGFyZV9zY2FubmVycyhweV9kYXRhLCBjX2RhdGEsIHZlcmJvc2UpOgorICAgIHB5X3Rva2VucyA9IGxpc3QoeWFtbC5zY2FuKHB5X2RhdGEsIExvYWRlcj15YW1sLlB5TG9hZGVyKSkKKyAgICBjX3Rva2VucyA9IFtdCisgICAgdHJ5OgorICAgICAgICBmb3IgdG9rZW4gaW4geWFtbC5zY2FuKGNfZGF0YSwgTG9hZGVyPXlhbWwuQ0xvYWRlcik6CisgICAgICAgICAgICBjX3Rva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgIGFzc2VydCBsZW4ocHlfdG9rZW5zKSA9PSBsZW4oY190b2tlbnMpLCAobGVuKHB5X3Rva2VucyksIGxlbihjX3Rva2VucykpCisgICAgICAgIGZvciBweV90b2tlbiwgY190b2tlbiBpbiB6aXAocHlfdG9rZW5zLCBjX3Rva2Vucyk6CisgICAgICAgICAgICBhc3NlcnQgcHlfdG9rZW4uX19jbGFzc19fID09IGNfdG9rZW4uX19jbGFzc19fLCAocHlfdG9rZW4sIGNfdG9rZW4pCisgICAgICAgICAgICBpZiBoYXNhdHRyKHB5X3Rva2VuLCAndmFsdWUnKToKKyAgICAgICAgICAgICAgICBhc3NlcnQgcHlfdG9rZW4udmFsdWUgPT0gY190b2tlbi52YWx1ZSwgKHB5X3Rva2VuLCBjX3Rva2VuKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShweV90b2tlbiwgeWFtbC5TdHJlYW1FbmRUb2tlbik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHB5X3N0YXJ0ID0gKHB5X3Rva2VuLnN0YXJ0X21hcmsuaW5kZXgsIHB5X3Rva2VuLnN0YXJ0X21hcmsubGluZSwgcHlfdG9rZW4uc3RhcnRfbWFyay5jb2x1bW4pCisgICAgICAgICAgICBweV9lbmQgPSAocHlfdG9rZW4uZW5kX21hcmsuaW5kZXgsIHB5X3Rva2VuLmVuZF9tYXJrLmxpbmUsIHB5X3Rva2VuLmVuZF9tYXJrLmNvbHVtbikKKyAgICAgICAgICAgIGNfc3RhcnQgPSAoY190b2tlbi5zdGFydF9tYXJrLmluZGV4LCBjX3Rva2VuLnN0YXJ0X21hcmsubGluZSwgY190b2tlbi5zdGFydF9tYXJrLmNvbHVtbikKKyAgICAgICAgICAgIGNfZW5kID0gKGNfdG9rZW4uZW5kX21hcmsuaW5kZXgsIGNfdG9rZW4uZW5kX21hcmsubGluZSwgY190b2tlbi5lbmRfbWFyay5jb2x1bW4pCisgICAgICAgICAgICBhc3NlcnQgcHlfc3RhcnQgPT0gY19zdGFydCwgKHB5X3N0YXJ0LCBjX3N0YXJ0KQorICAgICAgICAgICAgYXNzZXJ0IHB5X2VuZCA9PSBjX2VuZCwgKHB5X2VuZCwgY19lbmQpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJQWV9UT0tFTlM6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChweV90b2tlbnMpCisgICAgICAgICAgICBwcmludCAiQ19UT0tFTlM6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChjX3Rva2VucykKKworZGVmIHRlc3RfY19zY2FubmVyKGRhdGFfZmlsZW5hbWUsIGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX2NvbXBhcmVfc2Nhbm5lcnMob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKSwKKyAgICAgICAgICAgIG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksIHZlcmJvc2UpCisgICAgX2NvbXBhcmVfc2Nhbm5lcnMob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9zY2FubmVycyhvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJyksCisgICAgICAgICAgICBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJyksIHZlcmJvc2UpCisgICAgX2NvbXBhcmVfc2Nhbm5lcnMob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwKKyAgICAgICAgICAgIG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksIHZlcmJvc2UpCisKK3Rlc3RfY19zY2FubmVyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KK3Rlc3RfY19zY2FubmVyLnNraXAgPSBbJy5za2lwLWV4dCddCisKK2RlZiBfY29tcGFyZV9wYXJzZXJzKHB5X2RhdGEsIGNfZGF0YSwgdmVyYm9zZSk6CisgICAgcHlfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKHB5X2RhdGEsIExvYWRlcj15YW1sLlB5TG9hZGVyKSkKKyAgICBjX2V2ZW50cyA9IFtdCisgICAgdHJ5OgorICAgICAgICBmb3IgZXZlbnQgaW4geWFtbC5wYXJzZShjX2RhdGEsIExvYWRlcj15YW1sLkNMb2FkZXIpOgorICAgICAgICAgICAgY19ldmVudHMuYXBwZW5kKGV2ZW50KQorICAgICAgICBhc3NlcnQgbGVuKHB5X2V2ZW50cykgPT0gbGVuKGNfZXZlbnRzKSwgKGxlbihweV9ldmVudHMpLCBsZW4oY19ldmVudHMpKQorICAgICAgICBmb3IgcHlfZXZlbnQsIGNfZXZlbnQgaW4gemlwKHB5X2V2ZW50cywgY19ldmVudHMpOgorICAgICAgICAgICAgZm9yIGF0dHJpYnV0ZSBpbiBbJ19fY2xhc3NfXycsICdhbmNob3InLCAndGFnJywgJ2ltcGxpY2l0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJywgJ2V4cGxpY2l0JywgJ3ZlcnNpb24nLCAndGFncyddOgorICAgICAgICAgICAgICAgIHB5X3ZhbHVlID0gZ2V0YXR0cihweV9ldmVudCwgYXR0cmlidXRlLCBOb25lKQorICAgICAgICAgICAgICAgIGNfdmFsdWUgPSBnZXRhdHRyKGNfZXZlbnQsIGF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgcHlfdmFsdWUgPT0gY192YWx1ZSwgKHB5X2V2ZW50LCBjX2V2ZW50LCBhdHRyaWJ1dGUpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJQWV9FVkVOVFM6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChweV9ldmVudHMpCisgICAgICAgICAgICBwcmludCAiQ19FVkVOVFM6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChjX2V2ZW50cykKKworZGVmIHRlc3RfY19wYXJzZXIoZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLCB2ZXJib3NlKQorICAgIF9jb21wYXJlX3BhcnNlcnMob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSwKKyAgICAgICAgICAgIG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorCit0ZXN0X2NfcGFyc2VyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KK3Rlc3RfY19wYXJzZXIuc2tpcCA9IFsnLnNraXAtZXh0J10KKworZGVmIF9jb21wYXJlX2VtaXR0ZXJzKGRhdGEsIHZlcmJvc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShkYXRhLCBMb2FkZXI9eWFtbC5QeUxvYWRlcikpCisgICAgY19kYXRhID0geWFtbC5lbWl0KGV2ZW50cywgRHVtcGVyPXlhbWwuQ0R1bXBlcikKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCBjX2RhdGEKKyAgICBweV9ldmVudHMgPSBsaXN0KHlhbWwucGFyc2UoY19kYXRhLCBMb2FkZXI9eWFtbC5QeUxvYWRlcikpCisgICAgY19ldmVudHMgPSBsaXN0KHlhbWwucGFyc2UoY19kYXRhLCBMb2FkZXI9eWFtbC5DTG9hZGVyKSkKKyAgICB0cnk6CisgICAgICAgIGFzc2VydCBsZW4oZXZlbnRzKSA9PSBsZW4ocHlfZXZlbnRzKSwgKGxlbihldmVudHMpLCBsZW4ocHlfZXZlbnRzKSkKKyAgICAgICAgYXNzZXJ0IGxlbihldmVudHMpID09IGxlbihjX2V2ZW50cyksIChsZW4oZXZlbnRzKSwgbGVuKGNfZXZlbnRzKSkKKyAgICAgICAgZm9yIGV2ZW50LCBweV9ldmVudCwgY19ldmVudCBpbiB6aXAoZXZlbnRzLCBweV9ldmVudHMsIGNfZXZlbnRzKToKKyAgICAgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gWydfX2NsYXNzX18nLCAnYW5jaG9yJywgJ3RhZycsICdpbXBsaWNpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScsICdleHBsaWNpdCcsICd2ZXJzaW9uJywgJ3RhZ3MnXToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoZXZlbnQsIGF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBweV92YWx1ZSA9IGdldGF0dHIocHlfZXZlbnQsIGF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBjX3ZhbHVlID0gZ2V0YXR0cihjX2V2ZW50LCBhdHRyaWJ1dGUsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgYXR0cmlidXRlID09ICd0YWcnIGFuZCB2YWx1ZSBpbiBbTm9uZSwgdSchJ10gXAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHB5X3ZhbHVlIGluIFtOb25lLCB1JyEnXSBhbmQgY192YWx1ZSBpbiBbTm9uZSwgdSchJ106CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgYXR0cmlidXRlID09ICdleHBsaWNpdCcgYW5kIChweV92YWx1ZSBvciBjX3ZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBhc3NlcnQgdmFsdWUgPT0gcHlfdmFsdWUsIChldmVudCwgcHlfZXZlbnQsIGF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgdmFsdWUgPT0gY192YWx1ZSwgKGV2ZW50LCBjX2V2ZW50LCBhdHRyaWJ1dGUpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJFVkVOVFM6IgorICAgICAgICAgICAgcHByaW50LnBwcmludChldmVudHMpCisgICAgICAgICAgICBwcmludCAiUFlfRVZFTlRTOiIKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQocHlfZXZlbnRzKQorICAgICAgICAgICAgcHJpbnQgIkNfRVZFTlRTOiIKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQoY19ldmVudHMpCisKK2RlZiB0ZXN0X2NfZW1pdHRlcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIF9jb21wYXJlX2VtaXR0ZXJzKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorICAgIF9jb21wYXJlX2VtaXR0ZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksIHZlcmJvc2UpCisKK3Rlc3RfY19lbWl0dGVyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KK3Rlc3RfY19lbWl0dGVyLnNraXAgPSBbJy5za2lwLWV4dCddCisKK2RlZiB3cmFwX2V4dF9mdW5jdGlvbihmdW5jdGlvbik6CisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIF9zZXRfdXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2RzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3RlYXJfZG93bigpCisgICAgdHJ5OgorICAgICAgICB3cmFwcGVyLmZ1bmNfbmFtZSA9ICclc19leHQnICUgZnVuY3Rpb24uZnVuY19uYW1lCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHdyYXBwZXIudW5pdHRlc3RfbmFtZSA9ICclc19leHQnICUgZnVuY3Rpb24uZnVuY19uYW1lCisgICAgd3JhcHBlci51bml0dGVzdCA9IGZ1bmN0aW9uLnVuaXR0ZXN0CisgICAgd3JhcHBlci5za2lwID0gZ2V0YXR0cihmdW5jdGlvbiwgJ3NraXAnLCBbXSkrWycuc2tpcC1leHQnXQorICAgIHJldHVybiB3cmFwcGVyCisKK2RlZiB3cmFwX2V4dChjb2xsZWN0aW9ucyk6CisgICAgZnVuY3Rpb25zID0gW10KKyAgICBpZiBub3QgaXNpbnN0YW5jZShjb2xsZWN0aW9ucywgbGlzdCk6CisgICAgICAgIGNvbGxlY3Rpb25zID0gW2NvbGxlY3Rpb25zXQorICAgIGZvciBjb2xsZWN0aW9uIGluIGNvbGxlY3Rpb25zOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb2xsZWN0aW9uLCBkaWN0KToKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB2YXJzKGNvbGxlY3Rpb24pCisgICAgICAgIGtleXMgPSBjb2xsZWN0aW9uLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICB2YWx1ZSA9IGNvbGxlY3Rpb25ba2V5XQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZXMuRnVuY3Rpb25UeXBlKSBhbmQgaGFzYXR0cih2YWx1ZSwgJ3VuaXR0ZXN0Jyk6CisgICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFwcGVuZCh3cmFwX2V4dF9mdW5jdGlvbih2YWx1ZSkpCisgICAgZm9yIGZ1bmN0aW9uIGluIGZ1bmN0aW9uczoKKyAgICAgICAgYXNzZXJ0IGZ1bmN0aW9uLnVuaXR0ZXN0X25hbWUgbm90IGluIGdsb2JhbHMoKQorICAgICAgICBnbG9iYWxzKClbZnVuY3Rpb24udW5pdHRlc3RfbmFtZV0gPSBmdW5jdGlvbgorCitpbXBvcnQgdGVzdF90b2tlbnMsIHRlc3Rfc3RydWN0dXJlLCB0ZXN0X2Vycm9ycywgdGVzdF9yZXNvbHZlciwgdGVzdF9jb25zdHJ1Y3RvciwgICBcCisgICAgICAgIHRlc3RfZW1pdHRlciwgdGVzdF9yZXByZXNlbnRlciwgdGVzdF9yZWN1cnNpdmUsIHRlc3RfaW5wdXRfb3V0cHV0Cit3cmFwX2V4dChbdGVzdF90b2tlbnMsIHRlc3Rfc3RydWN0dXJlLCB0ZXN0X2Vycm9ycywgdGVzdF9yZXNvbHZlciwgdGVzdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgdGVzdF9lbWl0dGVyLCB0ZXN0X3JlcHJlc2VudGVyLCB0ZXN0X3JlY3Vyc2l2ZSwgdGVzdF9pbnB1dF9vdXRwdXRdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvY2Fub25pY2FsLnB5IGIvdGVzdHMvbGliMy9jYW5vbmljYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNGUzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvY2Fub25pY2FsLnB5CkBAIC0wLDAgKzEsMzYxIEBACisKK2ltcG9ydCB5YW1sLCB5YW1sLmNvbXBvc2VyLCB5YW1sLmNvbnN0cnVjdG9yLCB5YW1sLnJlc29sdmVyCisKK2NsYXNzIENhbm9uaWNhbEVycm9yKHlhbWwuWUFNTEVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIENhbm9uaWNhbFNjYW5uZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgYnl0ZXMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBDYW5vbmljYWxFcnJvcigidXRmLTggc3RyZWFtIGlzIGV4cGVjdGVkIikKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YSsnXDAnCisgICAgICAgIHNlbGYuaW5kZXggPSAwCisgICAgICAgIHNlbGYudG9rZW5zID0gW10KKyAgICAgICAgc2VsZi5zY2FubmVkID0gRmFsc2UKKworICAgIGRlZiBjaGVja190b2tlbihzZWxmLCAqY2hvaWNlcyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNjYW5uZWQ6CisgICAgICAgICAgICBzZWxmLnNjYW4oKQorICAgICAgICBpZiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIGlmIG5vdCBjaG9pY2VzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBmb3IgY2hvaWNlIGluIGNob2ljZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnRva2Vuc1swXSwgY2hvaWNlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcGVla190b2tlbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2Nhbm5lZDoKKyAgICAgICAgICAgIHNlbGYuc2NhbigpCisgICAgICAgIGlmIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zWzBdCisKKyAgICBkZWYgZ2V0X3Rva2VuKHNlbGYsIGNob2ljZT1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2Nhbm5lZDoKKyAgICAgICAgICAgIHNlbGYuc2NhbigpCisgICAgICAgIHRva2VuID0gc2VsZi50b2tlbnMucG9wKDApCisgICAgICAgIGlmIGNob2ljZSBhbmQgbm90IGlzaW5zdGFuY2UodG9rZW4sIGNob2ljZSk6CisgICAgICAgICAgICByYWlzZSBDYW5vbmljYWxFcnJvcigidW5leHBlY3RlZCB0b2tlbiAiK3JlcHIodG9rZW4pKQorICAgICAgICByZXR1cm4gdG9rZW4KKworICAgIGRlZiBnZXRfdG9rZW5fdmFsdWUoc2VsZik6CisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICByZXR1cm4gdG9rZW4udmFsdWUKKworICAgIGRlZiBzY2FuKHNlbGYpOgorICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoeWFtbC5TdHJlYW1TdGFydFRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5maW5kX3Rva2VuKCkKKyAgICAgICAgICAgIGNoID0gc2VsZi5kYXRhW3NlbGYuaW5kZXhdCisgICAgICAgICAgICBpZiBjaCA9PSAnXDAnOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLlN0cmVhbUVuZFRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGNoID09ICclJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX2RpcmVjdGl2ZSgpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnLScgYW5kIHNlbGYuZGF0YVtzZWxmLmluZGV4OnNlbGYuaW5kZXgrM10gPT0gJy0tLSc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAzCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRG9jdW1lbnRTdGFydFRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnWyc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRmxvd1NlcXVlbmNlU3RhcnRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3snOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLkZsb3dNYXBwaW5nU3RhcnRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJ10nOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLkZsb3dTZXF1ZW5jZUVuZFRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnfSc6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuRmxvd01hcHBpbmdFbmRUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJz8nOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLktleVRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnOic6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHlhbWwuVmFsdWVUb2tlbihOb25lLCBOb25lKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJywnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh5YW1sLkZsb3dFbnRyeVRva2VuKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnKicgb3IgY2ggPT0gJyYnOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fYWxpYXMoKSkKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJyEnOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZChzZWxmLnNjYW5fdGFnKCkpCisgICAgICAgICAgICBlbGlmIGNoID09ICciJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoc2VsZi5zY2FuX3NjYWxhcigpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBDYW5vbmljYWxFcnJvcigiaW52YWxpZCB0b2tlbiIpCisgICAgICAgIHNlbGYuc2Nhbm5lZCA9IFRydWUKKworICAgIERJUkVDVElWRSA9ICclWUFNTCAxLjEnCisKKyAgICBkZWYgc2Nhbl9kaXJlY3RpdmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGF0YVtzZWxmLmluZGV4OnNlbGYuaW5kZXgrbGVuKHNlbGYuRElSRUNUSVZFKV0gPT0gc2VsZi5ESVJFQ1RJVkUgYW5kIFwKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFbc2VsZi5pbmRleCtsZW4oc2VsZi5ESVJFQ1RJVkUpXSBpbiAnIFxuXDAnOgorICAgICAgICAgICAgc2VsZi5pbmRleCArPSBsZW4oc2VsZi5ESVJFQ1RJVkUpCisgICAgICAgICAgICByZXR1cm4geWFtbC5EaXJlY3RpdmVUb2tlbignWUFNTCcsICgxLCAxKSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIENhbm9uaWNhbEVycm9yKCJpbnZhbGlkIGRpcmVjdGl2ZSIpCisKKyAgICBkZWYgc2Nhbl9hbGlhcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXhdID09ICcqJzoKKyAgICAgICAgICAgIFRva2VuQ2xhc3MgPSB5YW1sLkFsaWFzVG9rZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRva2VuQ2xhc3MgPSB5YW1sLkFuY2hvclRva2VuCisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICBzdGFydCA9IHNlbGYuaW5kZXgKKyAgICAgICAgd2hpbGUgc2VsZi5kYXRhW3NlbGYuaW5kZXhdIG5vdCBpbiAnLCBcblwwJzoKKyAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICB2YWx1ZSA9IHNlbGYuZGF0YVtzdGFydDpzZWxmLmluZGV4XQorICAgICAgICByZXR1cm4gVG9rZW5DbGFzcyh2YWx1ZSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBzY2FuX3RhZyhzZWxmKToKKyAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICB3aGlsZSBzZWxmLmRhdGFbc2VsZi5pbmRleF0gbm90IGluICcgXG5cMCc6CisgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgdmFsdWUgPSBzZWxmLmRhdGFbc3RhcnQ6c2VsZi5pbmRleF0KKyAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgdmFsdWUgPSAnIScKKyAgICAgICAgZWxpZiB2YWx1ZVswXSA9PSAnISc6CisgICAgICAgICAgICB2YWx1ZSA9ICd0YWc6eWFtbC5vcmcsMjAwMjonK3ZhbHVlWzE6XQorICAgICAgICBlbGlmIHZhbHVlWzBdID09ICc8JyBhbmQgdmFsdWVbLTFdID09ICc+JzoKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMTotMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gJyEnK3ZhbHVlCisgICAgICAgIHJldHVybiB5YW1sLlRhZ1Rva2VuKHZhbHVlLCBOb25lLCBOb25lKQorCisgICAgUVVPVEVfQ09ERVMgPSB7CisgICAgICAgICd4JzogMiwKKyAgICAgICAgJ3UnOiA0LAorICAgICAgICAnVSc6IDgsCisgICAgfQorCisgICAgUVVPVEVfUkVQTEFDRVMgPSB7CisgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgICdcIic6ICdcIicsCisgICAgICAgICcgJzogJyAnLAorICAgICAgICAnYSc6ICdceDA3JywKKyAgICAgICAgJ2InOiAnXHgwOCcsCisgICAgICAgICdlJzogJ1x4MUInLAorICAgICAgICAnZic6ICdceDBDJywKKyAgICAgICAgJ24nOiAnXHgwQScsCisgICAgICAgICdyJzogJ1x4MEQnLAorICAgICAgICAndCc6ICdceDA5JywKKyAgICAgICAgJ3YnOiAnXHgwQicsCisgICAgICAgICdOJzogJ1x1MDA4NScsCisgICAgICAgICdMJzogJ1x1MjAyOCcsCisgICAgICAgICdQJzogJ1x1MjAyOScsCisgICAgICAgICdfJzogJ18nLAorICAgICAgICAnMCc6ICdceDAwJywKKyAgICB9CisKKyAgICBkZWYgc2Nhbl9zY2FsYXIoc2VsZik6CisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBzdGFydCA9IHNlbGYuaW5kZXgKKyAgICAgICAgaWdub3JlX3NwYWNlcyA9IEZhbHNlCisgICAgICAgIHdoaWxlIHNlbGYuZGF0YVtzZWxmLmluZGV4XSAhPSAnIic6CisgICAgICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBpZ25vcmVfc3BhY2VzID0gRmFsc2UKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuZGF0YVtzdGFydDpzZWxmLmluZGV4XSkKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBjaCA9IHNlbGYuZGF0YVtzZWxmLmluZGV4XQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIGlmIGNoID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9zcGFjZXMgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBjaCBpbiBzZWxmLlFVT1RFX0NPREVTOgorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLlFVT1RFX0NPREVTW2NoXQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gaW50KHNlbGYuZGF0YVtzZWxmLmluZGV4OnNlbGYuaW5kZXgrbGVuZ3RoXSwgMTYpCisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoY2hyKGNvZGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IGxlbmd0aAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoIG5vdCBpbiBzZWxmLlFVT1RFX1JFUExBQ0VTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoImludmFsaWQgZXNjYXBlIGNvZGUiKQorICAgICAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuUVVPVEVfUkVQTEFDRVNbY2hdKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICAgICAgZWxpZiBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlbGYuZGF0YVtzdGFydDpzZWxmLmluZGV4XSkKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKCcgJykKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBzdGFydCA9IHNlbGYuaW5kZXgKKyAgICAgICAgICAgICAgICBpZ25vcmVfc3BhY2VzID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBpZ25vcmVfc3BhY2VzIGFuZCBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gJyAnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5pbmRleAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZ25vcmVfc3BhY2VzID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgY2h1bmtzLmFwcGVuZChzZWxmLmRhdGFbc3RhcnQ6c2VsZi5pbmRleF0pCisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICByZXR1cm4geWFtbC5TY2FsYXJUb2tlbignJy5qb2luKGNodW5rcyksIEZhbHNlLCBOb25lLCBOb25lKQorCisgICAgZGVmIGZpbmRfdG9rZW4oc2VsZik6CisgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGZvdW5kOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5kYXRhW3NlbGYuaW5kZXhdIGluICcgXHQnOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYuaW5kZXhdID09ICcjJzoKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLmRhdGFbc2VsZi5pbmRleF0gIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisgICAgICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5pbmRleF0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisKK2NsYXNzIENhbm9uaWNhbFBhcnNlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5ldmVudHMgPSBbXQorICAgICAgICBzZWxmLnBhcnNlZCA9IEZhbHNlCisKKyAgICBkZWYgZGlzcG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgIyBzdHJlYW06IFNUUkVBTS1TVEFSVCBkb2N1bWVudCogU1RSRUFNLUVORAorICAgIGRlZiBwYXJzZV9zdHJlYW0oc2VsZik6CisgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuU3RyZWFtU3RhcnRUb2tlbikKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuU3RyZWFtU3RhcnRFdmVudChOb25lLCBOb25lKSkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5TdHJlYW1FbmRUb2tlbik6CisgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRGlyZWN0aXZlVG9rZW4sIHlhbWwuRG9jdW1lbnRTdGFydFRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlX2RvY3VtZW50KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQ2Fub25pY2FsRXJyb3IoImRvY3VtZW50IGlzIGV4cGVjdGVkLCBnb3QgIityZXByKHNlbGYudG9rZW5zWzBdKSkKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5TdHJlYW1FbmRUb2tlbikKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuU3RyZWFtRW5kRXZlbnQoTm9uZSwgTm9uZSkpCisKKyAgICAjIGRvY3VtZW50OiBESVJFQ1RJVkU/IERPQ1VNRU5ULVNUQVJUIG5vZGUKKyAgICBkZWYgcGFyc2VfZG9jdW1lbnQoc2VsZik6CisgICAgICAgIG5vZGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5EaXJlY3RpdmVUb2tlbik6CisgICAgICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLkRpcmVjdGl2ZVRva2VuKQorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLkRvY3VtZW50U3RhcnRUb2tlbikKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuRG9jdW1lbnRTdGFydEV2ZW50KE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLnBhcnNlX25vZGUoKQorICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5Eb2N1bWVudEVuZEV2ZW50KE5vbmUsIE5vbmUpKQorCisgICAgIyBub2RlOiBBTElBUyB8IEFOQ0hPUj8gVEFHPyAoU0NBTEFSfHNlcXVlbmNlfG1hcHBpbmcpCisgICAgZGVmIHBhcnNlX25vZGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5BbGlhc1Rva2VuKToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCh5YW1sLkFsaWFzRXZlbnQoc2VsZi5nZXRfdG9rZW5fdmFsdWUoKSwgTm9uZSwgTm9uZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbmNob3IgPSBOb25lCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuQW5jaG9yVG9rZW4pOgorICAgICAgICAgICAgICAgIGFuY2hvciA9IHNlbGYuZ2V0X3Rva2VuX3ZhbHVlKCkKKyAgICAgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5UYWdUb2tlbik6CisgICAgICAgICAgICAgICAgdGFnID0gc2VsZi5nZXRfdG9rZW5fdmFsdWUoKQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja190b2tlbih5YW1sLlNjYWxhclRva2VuKToKKyAgICAgICAgICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoeWFtbC5TY2FsYXJFdmVudChhbmNob3IsIHRhZywgKEZhbHNlLCBGYWxzZSksIHNlbGYuZ2V0X3Rva2VuX3ZhbHVlKCksIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd1NlcXVlbmNlU3RhcnRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuU2VxdWVuY2VTdGFydEV2ZW50KGFuY2hvciwgdGFnLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlX3NlcXVlbmNlKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5jaGVja190b2tlbih5YW1sLkZsb3dNYXBwaW5nU3RhcnRUb2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKHlhbWwuTWFwcGluZ1N0YXJ0RXZlbnQoYW5jaG9yLCB0YWcsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VfbWFwcGluZygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIENhbm9uaWNhbEVycm9yKCJTQ0FMQVIsICdbJywgb3IgJ3snIGlzIGV4cGVjdGVkLCBnb3QgIityZXByKHNlbGYudG9rZW5zWzBdKSkKKworICAgICMgc2VxdWVuY2U6IFNFUVVFTkNFLVNUQVJUIChub2RlIChFTlRSWSBub2RlKSopPyBFTlRSWT8gU0VRVUVOQ0UtRU5ECisgICAgZGVmIHBhcnNlX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLkZsb3dTZXF1ZW5jZVN0YXJ0VG9rZW4pCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgc2VsZi5wYXJzZV9ub2RlKCkKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd1NlcXVlbmNlRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRmxvd0VudHJ5VG9rZW4pCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93U2VxdWVuY2VFbmRUb2tlbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2Vfbm9kZSgpCisgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRmxvd1NlcXVlbmNlRW5kVG9rZW4pCisgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCh5YW1sLlNlcXVlbmNlRW5kRXZlbnQoTm9uZSwgTm9uZSkpCisKKyAgICAjIG1hcHBpbmc6IE1BUFBJTkctU1RBUlQgKG1hcF9lbnRyeSAoRU5UUlkgbWFwX2VudHJ5KSopPyBFTlRSWT8gTUFQUElORy1FTkQKKyAgICBkZWYgcGFyc2VfbWFwcGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5GbG93TWFwcGluZ1N0YXJ0VG9rZW4pCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3Rva2VuKHlhbWwuRmxvd01hcHBpbmdFbmRUb2tlbik6CisgICAgICAgICAgICBzZWxmLnBhcnNlX21hcF9lbnRyeSgpCisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5jaGVja190b2tlbih5YW1sLkZsb3dNYXBwaW5nRW5kVG9rZW4pOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3Rva2VuKHlhbWwuRmxvd0VudHJ5VG9rZW4pCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdG9rZW4oeWFtbC5GbG93TWFwcGluZ0VuZFRva2VuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV9tYXBfZW50cnkoKQorICAgICAgICBzZWxmLmdldF90b2tlbih5YW1sLkZsb3dNYXBwaW5nRW5kVG9rZW4pCisgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCh5YW1sLk1hcHBpbmdFbmRFdmVudChOb25lLCBOb25lKSkKKworICAgICMgbWFwX2VudHJ5OiBLRVkgbm9kZSBWQUxVRSBub2RlCisgICAgZGVmIHBhcnNlX21hcF9lbnRyeShzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5LZXlUb2tlbikKKyAgICAgICAgc2VsZi5wYXJzZV9ub2RlKCkKKyAgICAgICAgc2VsZi5nZXRfdG9rZW4oeWFtbC5WYWx1ZVRva2VuKQorICAgICAgICBzZWxmLnBhcnNlX25vZGUoKQorCisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlX3N0cmVhbSgpCisgICAgICAgIHNlbGYucGFyc2VkID0gVHJ1ZQorCisgICAgZGVmIGdldF9ldmVudChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VkOgorICAgICAgICAgICAgc2VsZi5wYXJzZSgpCisgICAgICAgIHJldHVybiBzZWxmLmV2ZW50cy5wb3AoMCkKKworICAgIGRlZiBjaGVja19ldmVudChzZWxmLCAqY2hvaWNlcyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlZDoKKyAgICAgICAgICAgIHNlbGYucGFyc2UoKQorICAgICAgICBpZiBzZWxmLmV2ZW50czoKKyAgICAgICAgICAgIGlmIG5vdCBjaG9pY2VzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBmb3IgY2hvaWNlIGluIGNob2ljZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmV2ZW50c1swXSwgY2hvaWNlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcGVla19ldmVudChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VkOgorICAgICAgICAgICAgc2VsZi5wYXJzZSgpCisgICAgICAgIHJldHVybiBzZWxmLmV2ZW50c1swXQorCitjbGFzcyBDYW5vbmljYWxMb2FkZXIoQ2Fub25pY2FsU2Nhbm5lciwgQ2Fub25pY2FsUGFyc2VyLAorICAgICAgICB5YW1sLmNvbXBvc2VyLkNvbXBvc2VyLCB5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yLCB5YW1sLnJlc29sdmVyLlJlc29sdmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0pOgorICAgICAgICBpZiBoYXNhdHRyKHN0cmVhbSwgJ3JlYWQnKToKKyAgICAgICAgICAgIHN0cmVhbSA9IHN0cmVhbS5yZWFkKCkKKyAgICAgICAgQ2Fub25pY2FsU2Nhbm5lci5fX2luaXRfXyhzZWxmLCBzdHJlYW0pCisgICAgICAgIENhbm9uaWNhbFBhcnNlci5fX2luaXRfXyhzZWxmKQorICAgICAgICB5YW1sLmNvbXBvc2VyLkNvbXBvc2VyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgeWFtbC5yZXNvbHZlci5SZXNvbHZlci5fX2luaXRfXyhzZWxmKQorCit5YW1sLkNhbm9uaWNhbExvYWRlciA9IENhbm9uaWNhbExvYWRlcgorCitkZWYgY2Fub25pY2FsX3NjYW4oc3RyZWFtKToKKyAgICByZXR1cm4geWFtbC5zY2FuKHN0cmVhbSwgTG9hZGVyPUNhbm9uaWNhbExvYWRlcikKKworeWFtbC5jYW5vbmljYWxfc2NhbiA9IGNhbm9uaWNhbF9zY2FuCisKK2RlZiBjYW5vbmljYWxfcGFyc2Uoc3RyZWFtKToKKyAgICByZXR1cm4geWFtbC5wYXJzZShzdHJlYW0sIExvYWRlcj1DYW5vbmljYWxMb2FkZXIpCisKK3lhbWwuY2Fub25pY2FsX3BhcnNlID0gY2Fub25pY2FsX3BhcnNlCisKK2RlZiBjYW5vbmljYWxfY29tcG9zZShzdHJlYW0pOgorICAgIHJldHVybiB5YW1sLmNvbXBvc2Uoc3RyZWFtLCBMb2FkZXI9Q2Fub25pY2FsTG9hZGVyKQorCit5YW1sLmNhbm9uaWNhbF9jb21wb3NlID0gY2Fub25pY2FsX2NvbXBvc2UKKworZGVmIGNhbm9uaWNhbF9jb21wb3NlX2FsbChzdHJlYW0pOgorICAgIHJldHVybiB5YW1sLmNvbXBvc2VfYWxsKHN0cmVhbSwgTG9hZGVyPUNhbm9uaWNhbExvYWRlcikKKworeWFtbC5jYW5vbmljYWxfY29tcG9zZV9hbGwgPSBjYW5vbmljYWxfY29tcG9zZV9hbGwKKworZGVmIGNhbm9uaWNhbF9sb2FkKHN0cmVhbSk6CisgICAgcmV0dXJuIHlhbWwubG9hZChzdHJlYW0sIExvYWRlcj1DYW5vbmljYWxMb2FkZXIpCisKK3lhbWwuY2Fub25pY2FsX2xvYWQgPSBjYW5vbmljYWxfbG9hZAorCitkZWYgY2Fub25pY2FsX2xvYWRfYWxsKHN0cmVhbSk6CisgICAgcmV0dXJuIHlhbWwubG9hZF9hbGwoc3RyZWFtLCBMb2FkZXI9Q2Fub25pY2FsTG9hZGVyKQorCit5YW1sLmNhbm9uaWNhbF9sb2FkX2FsbCA9IGNhbm9uaWNhbF9sb2FkX2FsbAorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfYWxsLnB5IGIvdGVzdHMvbGliMy90ZXN0X2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM0YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliMy90ZXN0X2FsbC5weQpAQCAtMCwwICsxLDE1IEBACisKK2ltcG9ydCBzeXMsIHlhbWwsIHRlc3RfYXBwbGlhbmNlCisKK2RlZiBtYWluKGFyZ3M9Tm9uZSk6CisgICAgY29sbGVjdGlvbnMgPSBbXQorICAgIGltcG9ydCB0ZXN0X3lhbWwKKyAgICBjb2xsZWN0aW9ucy5hcHBlbmQodGVzdF95YW1sKQorICAgIGlmIHlhbWwuX193aXRoX2xpYnlhbWxfXzoKKyAgICAgICAgaW1wb3J0IHRlc3RfeWFtbF9leHQKKyAgICAgICAgY29sbGVjdGlvbnMuYXBwZW5kKHRlc3RfeWFtbF9leHQpCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGNvbGxlY3Rpb25zLCBhcmdzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfYXBwbGlhbmNlLnB5IGIvdGVzdHMvbGliMy90ZXN0X2FwcGxpYW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZmMDBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliMy90ZXN0X2FwcGxpYW5jZS5weQpAQCAtMCwwICsxLDE0NSBAQAorCitpbXBvcnQgc3lzLCBvcywgb3MucGF0aCwgdHlwZXMsIHRyYWNlYmFjaywgcHByaW50CisKK0RBVEEgPSAndGVzdHMvZGF0YScKKworZGVmIGZpbmRfdGVzdF9mdW5jdGlvbnMoY29sbGVjdGlvbnMpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbGxlY3Rpb25zLCBsaXN0KToKKyAgICAgICAgY29sbGVjdGlvbnMgPSBbY29sbGVjdGlvbnNdCisgICAgZnVuY3Rpb25zID0gW10KKyAgICBmb3IgY29sbGVjdGlvbiBpbiBjb2xsZWN0aW9uczoKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29sbGVjdGlvbiwgZGljdCk6CisgICAgICAgICAgICBjb2xsZWN0aW9uID0gdmFycyhjb2xsZWN0aW9uKQorICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChjb2xsZWN0aW9uKToKKyAgICAgICAgICAgIHZhbHVlID0gY29sbGVjdGlvbltrZXldCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0eXBlcy5GdW5jdGlvblR5cGUpIGFuZCBoYXNhdHRyKHZhbHVlLCAndW5pdHRlc3QnKToKKyAgICAgICAgICAgICAgICBmdW5jdGlvbnMuYXBwZW5kKHZhbHVlKQorICAgIHJldHVybiBmdW5jdGlvbnMKKworZGVmIGZpbmRfdGVzdF9maWxlbmFtZXMoZGlyZWN0b3J5KToKKyAgICBmaWxlbmFtZXMgPSB7fQorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihkaXJlY3RvcnksIGZpbGVuYW1lKSk6CisgICAgICAgICAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLXB5MicpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmaWxlbmFtZXMuc2V0ZGVmYXVsdChiYXNlLCBbXSkuYXBwZW5kKGV4dCkKKyAgICBmaWxlbmFtZXMgPSBzb3J0ZWQoZmlsZW5hbWVzLml0ZW1zKCkpCisgICAgcmV0dXJuIGZpbGVuYW1lcworCitkZWYgcGFyc2VfYXJndW1lbnRzKGFyZ3MpOgorICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIHZlcmJvc2UgPSBGYWxzZQorICAgIGlmICctdicgaW4gYXJnczoKKyAgICAgICAgdmVyYm9zZSA9IFRydWUKKyAgICAgICAgYXJncy5yZW1vdmUoJy12JykKKyAgICBpZiAnLS12ZXJib3NlJyBpbiBhcmdzOgorICAgICAgICB2ZXJib3NlID0gVHJ1ZQorICAgIGlmICdZQU1MX1RFU1RfVkVSQk9TRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdmVyYm9zZSA9IFRydWUKKyAgICBpbmNsdWRlX2Z1bmN0aW9ucyA9IFtdCisgICAgaWYgYXJnczoKKyAgICAgICAgaW5jbHVkZV9mdW5jdGlvbnMuYXBwZW5kKGFyZ3MucG9wKDApKQorICAgIGlmICdZQU1MX1RFU1RfRlVOQ1RJT05TJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBpbmNsdWRlX2Z1bmN0aW9ucy5leHRlbmQob3MuZW52aXJvblsnWUFNTF9URVNUX0ZVTkNUSU9OUyddLnNwbGl0KCkpCisgICAgaW5jbHVkZV9maWxlbmFtZXMgPSBbXQorICAgIGluY2x1ZGVfZmlsZW5hbWVzLmV4dGVuZChhcmdzKQorICAgIGlmICdZQU1MX1RFU1RfRklMRU5BTUVTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBpbmNsdWRlX2ZpbGVuYW1lcy5leHRlbmQob3MuZW52aXJvblsnWUFNTF9URVNUX0ZJTEVOQU1FUyddLnNwbGl0KCkpCisgICAgcmV0dXJuIGluY2x1ZGVfZnVuY3Rpb25zLCBpbmNsdWRlX2ZpbGVuYW1lcywgdmVyYm9zZQorCitkZWYgZXhlY3V0ZShmdW5jdGlvbiwgZmlsZW5hbWVzLCB2ZXJib3NlKToKKyAgICBuYW1lID0gZnVuY3Rpb24uX19uYW1lX18KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCc9Jyo3NSsnXG4nKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclcyglcykuLi5cbicgJSAobmFtZSwgJywgJy5qb2luKGZpbGVuYW1lcykpKQorICAgIHRyeToKKyAgICAgICAgZnVuY3Rpb24odmVyYm9zZT12ZXJib3NlLCAqZmlsZW5hbWVzKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICBpbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleGMsIEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIGtpbmQgPSAnRkFJTFVSRScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtpbmQgPSAnRVJST1InCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGxpbWl0PTEsIGZpbGU9c3lzLnN0ZG91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoa2luZFswXSkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgIGVsc2U6CisgICAgICAgIGtpbmQgPSAnU1VDQ0VTUycKKyAgICAgICAgaW5mbyA9IE5vbmUKKyAgICAgICAgaWYgbm90IHZlcmJvc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCcuJykKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICByZXR1cm4gKG5hbWUsIGZpbGVuYW1lcywga2luZCwgaW5mbykKKworZGVmIGRpc3BsYXkocmVzdWx0cywgdmVyYm9zZSk6CisgICAgaWYgcmVzdWx0cyBhbmQgbm90IHZlcmJvc2U6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICB0b3RhbCA9IGxlbihyZXN1bHRzKQorICAgIGZhaWx1cmVzID0gMAorICAgIGVycm9ycyA9IDAKKyAgICBmb3IgbmFtZSwgZmlsZW5hbWVzLCBraW5kLCBpbmZvIGluIHJlc3VsdHM6CisgICAgICAgIGlmIGtpbmQgPT0gJ1NVQ0NFU1MnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYga2luZCA9PSAnRkFJTFVSRSc6CisgICAgICAgICAgICBmYWlsdXJlcyArPSAxCisgICAgICAgIGlmIGtpbmQgPT0gJ0VSUk9SJzoKKyAgICAgICAgICAgIGVycm9ycyArPSAxCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJz0nKjc1KydcbicpCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJyVzKCVzKTogJXNcbicgJSAobmFtZSwgJywgJy5qb2luKGZpbGVuYW1lcyksIGtpbmQpKQorICAgICAgICBpZiBraW5kID09ICdFUlJPUic6CisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKGZpbGU9c3lzLnN0ZG91dCwgKmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nKQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X3RiKGluZm9bMl0sIGZpbGU9c3lzLnN0ZG91dCkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJyVzOiBzZWUgYmVsb3dcbicgJSBpbmZvWzBdLl9fbmFtZV9fKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnficqNzUrJ1xuJykKKyAgICAgICAgICAgIGZvciBhcmcgaW4gaW5mb1sxXS5hcmdzOgorICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQoYXJnLCBzdHJlYW09c3lzLnN0ZG91dCkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJy0nKjc1KydcbicpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCclczpcbicgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSBvcGVuKGZpbGVuYW1lLCAncicsIGVycm9ycz0ncmVwbGFjZScpLnJlYWQoKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkYXRhKQorICAgICAgICAgICAgaWYgZGF0YSBhbmQgZGF0YVstMV0gIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgc3lzLnN0ZG91dC53cml0ZSgnPScqNzUrJ1xuJykKKyAgICBzeXMuc3Rkb3V0LndyaXRlKCdURVNUUzogJXNcbicgJSB0b3RhbCkKKyAgICBpZiBmYWlsdXJlczoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnRkFJTFVSRVM6ICVzXG4nICUgZmFpbHVyZXMpCisgICAgaWYgZXJyb3JzOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdFUlJPUlM6ICVzXG4nICUgZXJyb3JzKQorCitkZWYgcnVuKGNvbGxlY3Rpb25zLCBhcmdzPU5vbmUpOgorICAgIHRlc3RfZnVuY3Rpb25zID0gZmluZF90ZXN0X2Z1bmN0aW9ucyhjb2xsZWN0aW9ucykKKyAgICB0ZXN0X2ZpbGVuYW1lcyA9IGZpbmRfdGVzdF9maWxlbmFtZXMoREFUQSkKKyAgICBpbmNsdWRlX2Z1bmN0aW9ucywgaW5jbHVkZV9maWxlbmFtZXMsIHZlcmJvc2UgPSBwYXJzZV9hcmd1bWVudHMoYXJncykKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3IgZnVuY3Rpb24gaW4gdGVzdF9mdW5jdGlvbnM6CisgICAgICAgIGlmIGluY2x1ZGVfZnVuY3Rpb25zIGFuZCBmdW5jdGlvbi5fX25hbWVfXyBub3QgaW4gaW5jbHVkZV9mdW5jdGlvbnM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBmdW5jdGlvbi51bml0dGVzdDoKKyAgICAgICAgICAgIGZvciBiYXNlLCBleHRzIGluIHRlc3RfZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIGlmIGluY2x1ZGVfZmlsZW5hbWVzIGFuZCBiYXNlIG5vdCBpbiBpbmNsdWRlX2ZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBleHQgaW4gZnVuY3Rpb24udW5pdHRlc3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gZXh0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQob3MucGF0aC5qb2luKERBVEEsIGJhc2UrZXh0KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBza2lwX2V4dHMgPSBnZXRhdHRyKGZ1bmN0aW9uLCAnc2tpcCcsIFtdKQorICAgICAgICAgICAgICAgICAgICBmb3Igc2tpcF9leHQgaW4gc2tpcF9leHRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2tpcF9leHQgaW4gZXh0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZShmdW5jdGlvbiwgZmlsZW5hbWVzLCB2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVzdWx0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZShmdW5jdGlvbiwgW10sIHZlcmJvc2UpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpCisgICAgZGlzcGxheShyZXN1bHRzLCB2ZXJib3NlPXZlcmJvc2UpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9idWlsZC5weSBiL3Rlc3RzL2xpYjMvdGVzdF9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlOGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliMy90ZXN0X2J1aWxkLnB5CkBAIC0wLDAgKzEsMTAgQEAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzLCBvcywgZGlzdHV0aWxzLnV0aWwKKyAgICBidWlsZF9saWIgPSAnYnVpbGQvbGliJworICAgIGJ1aWxkX2xpYl9leHQgPSBvcy5wYXRoLmpvaW4oJ2J1aWxkJywgJ2xpYi4lcy0lcycgJSAoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBidWlsZF9saWIpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGJ1aWxkX2xpYl9leHQpCisgICAgaW1wb3J0IHRlc3RfeWFtbCwgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4odGVzdF95YW1sKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfYnVpbGRfZXh0LnB5IGIvdGVzdHMvbGliMy90ZXN0X2J1aWxkX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE5NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliMy90ZXN0X2J1aWxkX2V4dC5weQpAQCAtMCwwICsxLDExIEBACisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzLCBvcywgZGlzdHV0aWxzLnV0aWwKKyAgICBidWlsZF9saWIgPSAnYnVpbGQvbGliJworICAgIGJ1aWxkX2xpYl9leHQgPSBvcy5wYXRoLmpvaW4oJ2J1aWxkJywgJ2xpYi4lcy0lcycgJSAoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBidWlsZF9saWIpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGJ1aWxkX2xpYl9leHQpCisgICAgaW1wb3J0IHRlc3RfeWFtbF9leHQsIHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKHRlc3RfeWFtbF9leHQpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9jYW5vbmljYWwucHkgYi90ZXN0cy9saWIzL3Rlc3RfY2Fub25pY2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjExNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfY2Fub25pY2FsLnB5CkBAIC0wLDAgKzEsNDAgQEAKKworaW1wb3J0IHlhbWwsIGNhbm9uaWNhbAorCitkZWYgdGVzdF9jYW5vbmljYWxfc2Nhbm5lcihjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGRhdGEgPSBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpCisgICAgdG9rZW5zID0gbGlzdCh5YW1sLmNhbm9uaWNhbF9zY2FuKGRhdGEpKQorICAgIGFzc2VydCB0b2tlbnMsIHRva2VucworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CisgICAgICAgICAgICBwcmludCh0b2tlbikKKwordGVzdF9jYW5vbmljYWxfc2Nhbm5lci51bml0dGVzdCA9IFsnLmNhbm9uaWNhbCddCisKK2RlZiB0ZXN0X2Nhbm9uaWNhbF9wYXJzZXIoY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLnJlYWQoKQorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5jYW5vbmljYWxfcGFyc2UoZGF0YSkpCisgICAgYXNzZXJ0IGV2ZW50cywgZXZlbnRzCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIHByaW50KGV2ZW50KQorCit0ZXN0X2Nhbm9uaWNhbF9wYXJzZXIudW5pdHRlc3QgPSBbJy5jYW5vbmljYWwnXQorCitkZWYgdGVzdF9jYW5vbmljYWxfZXJyb3IoZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICB0cnk6CisgICAgICAgIG91dHB1dCA9IGxpc3QoeWFtbC5jYW5vbmljYWxfbG9hZF9hbGwoZGF0YSkpCisgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yIGFzIGV4YzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9jYW5vbmljYWxfZXJyb3IudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQordGVzdF9jYW5vbmljYWxfZXJyb3Iuc2tpcCA9IFsnLmVtcHR5J10KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4oZ2xvYmFscygpKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfY29uc3RydWN0b3IucHkgYi90ZXN0cy9saWIzL3Rlc3RfY29uc3RydWN0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZjUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF9jb25zdHJ1Y3Rvci5weQpAQCAtMCwwICsxLDI2MCBAQAorCitpbXBvcnQgeWFtbAoraW1wb3J0IHBwcmludAorCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB5YW1sLnRva2VucworCitkZWYgZXhlY3V0ZShjb2RlKToKKyAgICBnbG9iYWwgdmFsdWUKKyAgICBleGVjKGNvZGUpCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBfbWFrZV9vYmplY3RzKCk6CisgICAgZ2xvYmFsIE15TG9hZGVyLCBNeUR1bXBlciwgTXlUZXN0Q2xhc3MxLCBNeVRlc3RDbGFzczIsIE15VGVzdENsYXNzMywgWUFNTE9iamVjdDEsIFlBTUxPYmplY3QyLCAgXAorICAgICAgICAgICAgQW5PYmplY3QsIEFuSW5zdGFuY2UsIEFTdGF0ZSwgQUN1c3RvbVN0YXRlLCBJbml0QXJncywgSW5pdEFyZ3NXaXRoU3RhdGUsICAgIFwKKyAgICAgICAgICAgIE5ld0FyZ3MsIE5ld0FyZ3NXaXRoU3RhdGUsIFJlZHVjZSwgUmVkdWNlV2l0aFN0YXRlLCBNeUludCwgTXlMaXN0LCBNeURpY3QsICBcCisgICAgICAgICAgICBGaXhlZE9mZnNldCwgdG9kYXksIGV4ZWN1dGUKKworICAgIGNsYXNzIE15TG9hZGVyKHlhbWwuTG9hZGVyKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzIE15RHVtcGVyKHlhbWwuRHVtcGVyKToKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgTXlUZXN0Q2xhc3MxOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeT0wLCB6PTApOgorICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgc2VsZi55ID0geQorICAgICAgICAgICAgc2VsZi56ID0gegorICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE15VGVzdENsYXNzMSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fY2xhc3NfXywgb3RoZXIuX19kaWN0X18KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgY29uc3RydWN0MShjb25zdHJ1Y3Rvciwgbm9kZSk6CisgICAgICAgIG1hcHBpbmcgPSBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfbWFwcGluZyhub2RlKQorICAgICAgICByZXR1cm4gTXlUZXN0Q2xhc3MxKCoqbWFwcGluZykKKyAgICBkZWYgcmVwcmVzZW50MShyZXByZXNlbnRlciwgbmF0aXZlKToKKyAgICAgICAgcmV0dXJuIHJlcHJlc2VudGVyLnJlcHJlc2VudF9tYXBwaW5nKCIhdGFnMSIsIG5hdGl2ZS5fX2RpY3RfXykKKworICAgIHlhbWwuYWRkX2NvbnN0cnVjdG9yKCIhdGFnMSIsIGNvbnN0cnVjdDEsIExvYWRlcj1NeUxvYWRlcikKKyAgICB5YW1sLmFkZF9yZXByZXNlbnRlcihNeVRlc3RDbGFzczEsIHJlcHJlc2VudDEsIER1bXBlcj1NeUR1bXBlcikKKworICAgIGNsYXNzIE15VGVzdENsYXNzMihNeVRlc3RDbGFzczEsIHlhbWwuWUFNTE9iamVjdCk6CisgICAgICAgIHlhbWxfbG9hZGVyID0gTXlMb2FkZXIKKyAgICAgICAgeWFtbF9kdW1wZXIgPSBNeUR1bXBlcgorICAgICAgICB5YW1sX3RhZyA9ICIhdGFnMiIKKyAgICAgICAgZGVmIGZyb21feWFtbChjbHMsIGNvbnN0cnVjdG9yLCBub2RlKToKKyAgICAgICAgICAgIHggPSBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RfeWFtbF9pbnQobm9kZSkKKyAgICAgICAgICAgIHJldHVybiBjbHMoeD14KQorICAgICAgICBmcm9tX3lhbWwgPSBjbGFzc21ldGhvZChmcm9tX3lhbWwpCisgICAgICAgIGRlZiB0b195YW1sKGNscywgcmVwcmVzZW50ZXIsIG5hdGl2ZSk6CisgICAgICAgICAgICByZXR1cm4gcmVwcmVzZW50ZXIucmVwcmVzZW50X3NjYWxhcihjbHMueWFtbF90YWcsIHN0cihuYXRpdmUueCkpCisgICAgICAgIHRvX3lhbWwgPSBjbGFzc21ldGhvZCh0b195YW1sKQorCisgICAgY2xhc3MgTXlUZXN0Q2xhc3MzKE15VGVzdENsYXNzMik6CisgICAgICAgIHlhbWxfdGFnID0gIiF0YWczIgorICAgICAgICBkZWYgZnJvbV95YW1sKGNscywgY29uc3RydWN0b3IsIG5vZGUpOgorICAgICAgICAgICAgbWFwcGluZyA9IGNvbnN0cnVjdG9yLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUpCisgICAgICAgICAgICBpZiAnPScgaW4gbWFwcGluZzoKKyAgICAgICAgICAgICAgICB4ID0gbWFwcGluZ1snPSddCisgICAgICAgICAgICAgICAgZGVsIG1hcHBpbmdbJz0nXQorICAgICAgICAgICAgICAgIG1hcHBpbmdbJ3gnXSA9IHgKKyAgICAgICAgICAgIHJldHVybiBjbHMoKiptYXBwaW5nKQorICAgICAgICBmcm9tX3lhbWwgPSBjbGFzc21ldGhvZChmcm9tX3lhbWwpCisgICAgICAgIGRlZiB0b195YW1sKGNscywgcmVwcmVzZW50ZXIsIG5hdGl2ZSk6CisgICAgICAgICAgICByZXR1cm4gcmVwcmVzZW50ZXIucmVwcmVzZW50X21hcHBpbmcoY2xzLnlhbWxfdGFnLCBuYXRpdmUuX19kaWN0X18pCisgICAgICAgIHRvX3lhbWwgPSBjbGFzc21ldGhvZCh0b195YW1sKQorCisgICAgY2xhc3MgWUFNTE9iamVjdDEoeWFtbC5ZQU1MT2JqZWN0KToKKyAgICAgICAgeWFtbF9sb2FkZXIgPSBNeUxvYWRlcgorICAgICAgICB5YW1sX2R1bXBlciA9IE15RHVtcGVyCisgICAgICAgIHlhbWxfdGFnID0gJyFmb28nCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBteV9wYXJhbWV0ZXI9Tm9uZSwgbXlfYW5vdGhlcl9wYXJhbWV0ZXI9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLm15X3BhcmFtZXRlciA9IG15X3BhcmFtZXRlcgorICAgICAgICAgICAgc2VsZi5teV9hbm90aGVyX3BhcmFtZXRlciA9IG15X2Fub3RoZXJfcGFyYW1ldGVyCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgWUFNTE9iamVjdDEpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2NsYXNzX18sIG90aGVyLl9fZGljdF9fCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgY2xhc3MgWUFNTE9iamVjdDIoeWFtbC5ZQU1MT2JqZWN0KToKKyAgICAgICAgeWFtbF9sb2FkZXIgPSBNeUxvYWRlcgorICAgICAgICB5YW1sX2R1bXBlciA9IE15RHVtcGVyCisgICAgICAgIHlhbWxfdGFnID0gJyFiYXInCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb289MSwgYmFyPTIsIGJhej0zKToKKyAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBzZWxmLmJhciA9IGJhcgorICAgICAgICAgICAgc2VsZi5iYXogPSBiYXoKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiB7MTogc2VsZi5mb28sIDI6IHNlbGYuYmFyLCAzOiBzZWxmLmJhen0KKyAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICBzZWxmLmZvbyA9IHN0YXRlWzFdCisgICAgICAgICAgICBzZWxmLmJhciA9IHN0YXRlWzJdCisgICAgICAgICAgICBzZWxmLmJheiA9IHN0YXRlWzNdCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgWUFNTE9iamVjdDIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2NsYXNzX18sIG90aGVyLl9fZGljdF9fCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgY2xhc3MgQW5PYmplY3Q6CisgICAgICAgIGRlZiBfX25ld19fKGNscywgZm9vPU5vbmUsIGJhcj1Ob25lLCBiYXo9Tm9uZSk6CisgICAgICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgICAgICBzZWxmLmJheiA9IGJhegorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIGNtcCgodHlwZShzZWxmKSwgc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheiksCisgICAgICAgICAgICAgICAgICAgICh0eXBlKG90aGVyKSwgb3RoZXIuZm9vLCBvdGhlci5iYXIsIG90aGVyLmJheikpCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikgaXMgdHlwZShvdGhlcikgYW5kICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZm9vLCBzZWxmLmJhciwgc2VsZi5iYXopID09IChvdGhlci5mb28sIG90aGVyLmJhciwgb3RoZXIuYmF6KQorCisgICAgY2xhc3MgQW5JbnN0YW5jZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbz1Ob25lLCBiYXI9Tm9uZSwgYmF6PU5vbmUpOgorICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgICAgICBzZWxmLmJheiA9IGJhegorICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gY21wKCh0eXBlKHNlbGYpLCBzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6KSwKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUob3RoZXIpLCBvdGhlci5mb28sIG90aGVyLmJhciwgb3RoZXIuYmF6KSkKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKSBpcyB0eXBlKG90aGVyKSBhbmQgICAgXAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheikgPT0gKG90aGVyLmZvbywgb3RoZXIuYmFyLCBvdGhlci5iYXopCisKKyAgICBjbGFzcyBBU3RhdGUoQW5JbnN0YW5jZSk6CisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICdfZm9vJzogc2VsZi5mb28sCisgICAgICAgICAgICAgICAgJ19iYXInOiBzZWxmLmJhciwKKyAgICAgICAgICAgICAgICAnX2Jheic6IHNlbGYuYmF6LAorICAgICAgICAgICAgfQorICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgIHNlbGYuZm9vID0gc3RhdGVbJ19mb28nXQorICAgICAgICAgICAgc2VsZi5iYXIgPSBzdGF0ZVsnX2JhciddCisgICAgICAgICAgICBzZWxmLmJheiA9IHN0YXRlWydfYmF6J10KKworICAgIGNsYXNzIEFDdXN0b21TdGF0ZShBbkluc3RhbmNlKToKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sIHNlbGYuYmFyLCBzZWxmLmJheikKKyAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICBzZWxmLmZvbywgc2VsZi5iYXIsIHNlbGYuYmF6ID0gc3RhdGUKKworICAgIGNsYXNzIE5ld0FyZ3MoQW5PYmplY3QpOgorICAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gKHNlbGYuZm9vLCBzZWxmLmJhciwgc2VsZi5iYXopCisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4ge30KKworICAgIGNsYXNzIE5ld0FyZ3NXaXRoU3RhdGUoQW5PYmplY3QpOgorICAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gKHNlbGYuZm9vLCBzZWxmLmJhcikKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJhegorICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgIHNlbGYuYmF6ID0gc3RhdGUKKworICAgIEluaXRBcmdzID0gTmV3QXJncworCisgICAgSW5pdEFyZ3NXaXRoU3RhdGUgPSBOZXdBcmdzV2l0aFN0YXRlCisKKyAgICBjbGFzcyBSZWR1Y2UoQW5PYmplY3QpOgorICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKHNlbGYuZm9vLCBzZWxmLmJhciwgc2VsZi5iYXopCisKKyAgICBjbGFzcyBSZWR1Y2VXaXRoU3RhdGUoQW5PYmplY3QpOgorICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKHNlbGYuZm9vLCBzZWxmLmJhciksIHNlbGYuYmF6CisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgc2VsZi5iYXogPSBzdGF0ZQorCisgICAgY2xhc3MgTXlJbnQoaW50KToKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKSBpcyB0eXBlKG90aGVyKSBhbmQgaW50KHNlbGYpID09IGludChvdGhlcikKKworICAgIGNsYXNzIE15TGlzdChsaXN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG49MSk6CisgICAgICAgICAgICBzZWxmLmV4dGVuZChbTm9uZV0qbikKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKSBpcyB0eXBlKG90aGVyKSBhbmQgbGlzdChzZWxmKSA9PSBsaXN0KG90aGVyKQorCisgICAgY2xhc3MgTXlEaWN0KGRpY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbj0xKToKKyAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgICAgIHNlbGZba10gPSBOb25lCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikgaXMgdHlwZShvdGhlcikgYW5kIGRpY3Qoc2VsZikgPT0gZGljdChvdGhlcikKKworICAgIGNsYXNzIEZpeGVkT2Zmc2V0KGRhdGV0aW1lLnR6aW5mbyk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIG5hbWUpOgorICAgICAgICAgICAgc2VsZi5fX29mZnNldCA9IGRhdGV0aW1lLnRpbWVkZWx0YShtaW51dGVzPW9mZnNldCkKKyAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fb2Zmc2V0CisgICAgICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCisgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnRpbWVkZWx0YSgwKQorCisgICAgdG9kYXkgPSBkYXRldGltZS5kYXRlLnRvZGF5KCkKKworZGVmIF9sb2FkX2NvZGUoZXhwcmVzc2lvbik6CisgICAgcmV0dXJuIGV2YWwoZXhwcmVzc2lvbikKKworZGVmIF9zZXJpYWxpemVfdmFsdWUoZGF0YSk6CisgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBsaXN0KToKKyAgICAgICAgcmV0dXJuICdbJXNdJyAlICcsICcuam9pbihtYXAoX3NlcmlhbGl6ZV92YWx1ZSwgZGF0YSkpCisgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIGtleSA9IF9zZXJpYWxpemVfdmFsdWUoa2V5KQorICAgICAgICAgICAgdmFsdWUgPSBfc2VyaWFsaXplX3ZhbHVlKHZhbHVlKQorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKCIlczogJXMiICUgKGtleSwgdmFsdWUpKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgcmV0dXJuICd7JXN9JyAlICcsICcuam9pbihpdGVtcykKKyAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgZGF0ZXRpbWUuZGF0ZXRpbWUpOgorICAgICAgICByZXR1cm4gcmVwcihkYXRhLnV0Y3RpbWV0dXBsZSgpKQorICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCBmbG9hdCkgYW5kIGRhdGEgIT0gZGF0YToKKyAgICAgICAgcmV0dXJuICc/JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzdHIoZGF0YSkKKworZGVmIHRlc3RfY29uc3RydWN0b3JfdHlwZXMoZGF0YV9maWxlbmFtZSwgY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2Vfb2JqZWN0cygpCisgICAgbmF0aXZlMSA9IE5vbmUKKyAgICBuYXRpdmUyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgbmF0aXZlMSA9IGxpc3QoeWFtbC5sb2FkX2FsbChvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLCBMb2FkZXI9TXlMb2FkZXIpKQorICAgICAgICBpZiBsZW4obmF0aXZlMSkgPT0gMToKKyAgICAgICAgICAgIG5hdGl2ZTEgPSBuYXRpdmUxWzBdCisgICAgICAgIG5hdGl2ZTIgPSBfbG9hZF9jb2RlKG9wZW4oY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBuYXRpdmUxID09IG5hdGl2ZTI6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiU0VSSUFMSVpFRCBOQVRJVkUxOiIpCisgICAgICAgICAgICBwcmludChfc2VyaWFsaXplX3ZhbHVlKG5hdGl2ZTEpKQorICAgICAgICAgICAgcHJpbnQoIlNFUklBTElaRUQgTkFUSVZFMjoiKQorICAgICAgICAgICAgcHJpbnQoX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUyKSkKKyAgICAgICAgYXNzZXJ0IF9zZXJpYWxpemVfdmFsdWUobmF0aXZlMSkgPT0gX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUyKSwgKG5hdGl2ZTEsIG5hdGl2ZTIpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJOQVRJVkUxOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KG5hdGl2ZTEpCisgICAgICAgICAgICBwcmludCgiTkFUSVZFMjoiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUyKQorCit0ZXN0X2NvbnN0cnVjdG9yX3R5cGVzLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY29kZSddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cywgdGVzdF9jb25zdHJ1Y3RvcgorICAgIHN5cy5tb2R1bGVzWyd0ZXN0X2NvbnN0cnVjdG9yJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9lbWl0dGVyLnB5IGIvdGVzdHMvbGliMy90ZXN0X2VtaXR0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkMTY1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF9lbWl0dGVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisKK2ltcG9ydCB5YW1sCisKK2RlZiBfY29tcGFyZV9ldmVudHMoZXZlbnRzMSwgZXZlbnRzMik6CisgICAgYXNzZXJ0IGxlbihldmVudHMxKSA9PSBsZW4oZXZlbnRzMiksIChldmVudHMxLCBldmVudHMyKQorICAgIGZvciBldmVudDEsIGV2ZW50MiBpbiB6aXAoZXZlbnRzMSwgZXZlbnRzMik6CisgICAgICAgIGFzc2VydCBldmVudDEuX19jbGFzc19fID09IGV2ZW50Mi5fX2NsYXNzX18sIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudDEsIHlhbWwuTm9kZUV2ZW50KToKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEuYW5jaG9yID09IGV2ZW50Mi5hbmNob3IsIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudDEsIHlhbWwuQ29sbGVjdGlvblN0YXJ0RXZlbnQpOgorICAgICAgICAgICAgYXNzZXJ0IGV2ZW50MS50YWcgPT0gZXZlbnQyLnRhZywgKGV2ZW50MSwgZXZlbnQyKQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50MSwgeWFtbC5TY2FsYXJFdmVudCk6CisgICAgICAgICAgICBpZiBUcnVlIG5vdCBpbiBldmVudDEuaW1wbGljaXQrZXZlbnQyLmltcGxpY2l0OgorICAgICAgICAgICAgICAgIGFzc2VydCBldmVudDEudGFnID09IGV2ZW50Mi50YWcsIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEudmFsdWUgPT0gZXZlbnQyLnZhbHVlLCAoZXZlbnQxLCBldmVudDIpCisKK2RlZiB0ZXN0X2VtaXR0ZXJfb25fZGF0YShkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKSkKKyAgICBvdXRwdXQgPSB5YW1sLmVtaXQoZXZlbnRzKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50KCJPVVRQVVQ6IikKKyAgICAgICAgcHJpbnQob3V0cHV0KQorICAgIG5ld19ldmVudHMgPSBsaXN0KHlhbWwucGFyc2Uob3V0cHV0KSkKKyAgICBfY29tcGFyZV9ldmVudHMoZXZlbnRzLCBuZXdfZXZlbnRzKQorCit0ZXN0X2VtaXR0ZXJfb25fZGF0YS51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmNhbm9uaWNhbCddCisKK2RlZiB0ZXN0X2VtaXR0ZXJfb25fY2Fub25pY2FsKGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSkpCisgICAgZm9yIGNhbm9uaWNhbCBpbiBbRmFsc2UsIFRydWVdOgorICAgICAgICBvdXRwdXQgPSB5YW1sLmVtaXQoZXZlbnRzLCBjYW5vbmljYWw9Y2Fub25pY2FsKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIk9VVFBVVCAoY2Fub25pY2FsPSVzKToiICUgY2Fub25pY2FsKQorICAgICAgICAgICAgcHJpbnQob3V0cHV0KQorICAgICAgICBuZXdfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG91dHB1dCkpCisgICAgICAgIF9jb21wYXJlX2V2ZW50cyhldmVudHMsIG5ld19ldmVudHMpCisKK3Rlc3RfZW1pdHRlcl9vbl9jYW5vbmljYWwudW5pdHRlc3QgPSBbJy5jYW5vbmljYWwnXQorCitkZWYgdGVzdF9lbWl0dGVyX3N0eWxlcyhkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGZvciBmaWxlbmFtZSBpbiBbZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lXToKKyAgICAgICAgZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG9wZW4oZmlsZW5hbWUsICdyYicpKSkKKyAgICAgICAgZm9yIGZsb3dfc3R5bGUgaW4gW0ZhbHNlLCBUcnVlXToKKyAgICAgICAgICAgIGZvciBzdHlsZSBpbiBbJ3wnLCAnPicsICciJywgJ1wnJywgJyddOgorICAgICAgICAgICAgICAgIHN0eWxlZF9ldmVudHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIHlhbWwuU2NhbGFyRXZlbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSB5YW1sLlNjYWxhckV2ZW50KGV2ZW50LmFuY2hvciwgZXZlbnQudGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5pbXBsaWNpdCwgZXZlbnQudmFsdWUsIHN0eWxlPXN0eWxlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIHlhbWwuU2VxdWVuY2VTdGFydEV2ZW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0geWFtbC5TZXF1ZW5jZVN0YXJ0RXZlbnQoZXZlbnQuYW5jaG9yLCBldmVudC50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmltcGxpY2l0LCBmbG93X3N0eWxlPWZsb3dfc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgeWFtbC5NYXBwaW5nU3RhcnRFdmVudCk6CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHlhbWwuTWFwcGluZ1N0YXJ0RXZlbnQoZXZlbnQuYW5jaG9yLCBldmVudC50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmltcGxpY2l0LCBmbG93X3N0eWxlPWZsb3dfc3R5bGUpCisgICAgICAgICAgICAgICAgICAgIHN0eWxlZF9ldmVudHMuYXBwZW5kKGV2ZW50KQorICAgICAgICAgICAgICAgIG91dHB1dCA9IHlhbWwuZW1pdChzdHlsZWRfZXZlbnRzKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJPVVRQVVQgKGZpbGVuYW1lPSVyLCBmbG93X3N0eWxlPSVyLCBzdHlsZT0lcikiICUgKGZpbGVuYW1lLCBmbG93X3N0eWxlLCBzdHlsZSkpCisgICAgICAgICAgICAgICAgICAgIHByaW50KG91dHB1dCkKKyAgICAgICAgICAgICAgICBuZXdfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKG91dHB1dCkpCisgICAgICAgICAgICAgICAgX2NvbXBhcmVfZXZlbnRzKGV2ZW50cywgbmV3X2V2ZW50cykKKwordGVzdF9lbWl0dGVyX3N0eWxlcy51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmNhbm9uaWNhbCddCisKK2NsYXNzIEV2ZW50c0xvYWRlcih5YW1sLkxvYWRlcik6CisKKyAgICBkZWYgY29uc3RydWN0X2V2ZW50KHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHlhbWwuU2NhbGFyTm9kZSk6CisgICAgICAgICAgICBtYXBwaW5nID0ge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBzZWxmLmNvbnN0cnVjdF9tYXBwaW5nKG5vZGUpCisgICAgICAgIGNsYXNzX25hbWUgPSBzdHIobm9kZS50YWdbMTpdKSsnRXZlbnQnCisgICAgICAgIGlmIGNsYXNzX25hbWUgaW4gWydBbGlhc0V2ZW50JywgJ1NjYWxhckV2ZW50JywgJ1NlcXVlbmNlU3RhcnRFdmVudCcsICdNYXBwaW5nU3RhcnRFdmVudCddOgorICAgICAgICAgICAgbWFwcGluZy5zZXRkZWZhdWx0KCdhbmNob3InLCBOb25lKQorICAgICAgICBpZiBjbGFzc19uYW1lIGluIFsnU2NhbGFyRXZlbnQnLCAnU2VxdWVuY2VTdGFydEV2ZW50JywgJ01hcHBpbmdTdGFydEV2ZW50J106CisgICAgICAgICAgICBtYXBwaW5nLnNldGRlZmF1bHQoJ3RhZycsIE5vbmUpCisgICAgICAgIGlmIGNsYXNzX25hbWUgaW4gWydTZXF1ZW5jZVN0YXJ0RXZlbnQnLCAnTWFwcGluZ1N0YXJ0RXZlbnQnXToKKyAgICAgICAgICAgIG1hcHBpbmcuc2V0ZGVmYXVsdCgnaW1wbGljaXQnLCBUcnVlKQorICAgICAgICBpZiBjbGFzc19uYW1lID09ICdTY2FsYXJFdmVudCc6CisgICAgICAgICAgICBtYXBwaW5nLnNldGRlZmF1bHQoJ2ltcGxpY2l0JywgKEZhbHNlLCBUcnVlKSkKKyAgICAgICAgICAgIG1hcHBpbmcuc2V0ZGVmYXVsdCgndmFsdWUnLCAnJykKKyAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHlhbWwsIGNsYXNzX25hbWUpKCoqbWFwcGluZykKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKK0V2ZW50c0xvYWRlci5hZGRfY29uc3RydWN0b3IoTm9uZSwgRXZlbnRzTG9hZGVyLmNvbnN0cnVjdF9ldmVudCkKKworZGVmIHRlc3RfZW1pdHRlcl9ldmVudHMoZXZlbnRzX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBldmVudHMgPSBsaXN0KHlhbWwubG9hZChvcGVuKGV2ZW50c19maWxlbmFtZSwgJ3JiJyksIExvYWRlcj1FdmVudHNMb2FkZXIpKQorICAgIG91dHB1dCA9IHlhbWwuZW1pdChldmVudHMpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQoIk9VVFBVVDoiKQorICAgICAgICBwcmludChvdXRwdXQpCisgICAgbmV3X2V2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShvdXRwdXQpKQorICAgIF9jb21wYXJlX2V2ZW50cyhldmVudHMsIG5ld19ldmVudHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliMy90ZXN0X2Vycm9ycy5weSBiL3Rlc3RzL2xpYjMvdGVzdF9lcnJvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmODZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF9lcnJvcnMucHkKQEAgLTAsMCArMSw2NyBAQAorCitpbXBvcnQgeWFtbCwgdGVzdF9lbWl0dGVyCisKK2RlZiB0ZXN0X2xvYWRlcl9lcnJvcihlcnJvcl9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgdHJ5OgorICAgICAgICBsaXN0KHlhbWwubG9hZF9hbGwob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJykpKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXM6IiAlIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9sb2FkZXJfZXJyb3IudW5pdHRlc3QgPSBbJy5sb2FkZXItZXJyb3InXQorCitkZWYgdGVzdF9sb2FkZXJfZXJyb3Jfc3RyaW5nKGVycm9yX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICB0cnk6CisgICAgICAgIGxpc3QoeWFtbC5sb2FkX2FsbChvcGVuKGVycm9yX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkpKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXM6IiAlIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9sb2FkZXJfZXJyb3Jfc3RyaW5nLnVuaXR0ZXN0ID0gWycubG9hZGVyLWVycm9yJ10KKworZGVmIHRlc3RfbG9hZGVyX2Vycm9yX3NpbmdsZShlcnJvcl9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgdHJ5OgorICAgICAgICB5YW1sLmxvYWQob3BlbihlcnJvcl9maWxlbmFtZSwgJ3JiJykucmVhZCgpKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXM6IiAlIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9sb2FkZXJfZXJyb3Jfc2luZ2xlLnVuaXR0ZXN0ID0gWycuc2luZ2xlLWxvYWRlci1lcnJvciddCisKK2RlZiB0ZXN0X2VtaXR0ZXJfZXJyb3IoZXJyb3JfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5sb2FkKG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpLAorICAgICAgICAgICAgICAgICAgICBMb2FkZXI9dGVzdF9lbWl0dGVyLkV2ZW50c0xvYWRlcikpCisgICAgdHJ5OgorICAgICAgICB5YW1sLmVtaXQoZXZlbnRzKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXM6IiAlIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9lbWl0dGVyX2Vycm9yLnVuaXR0ZXN0ID0gWycuZW1pdHRlci1lcnJvciddCisKK2RlZiB0ZXN0X2R1bXBlcl9lcnJvcihlcnJvcl9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgY29kZSA9IG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpLnJlYWQoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHlhbWwKKyAgICAgICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhlYyhjb2RlKQorICAgIGV4Y2VwdCB5YW1sLllBTUxFcnJvciBhcyBleGM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXM6IiAlIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIGV4YykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgYW4gZXhjZXB0aW9uIikKKwordGVzdF9kdW1wZXJfZXJyb3IudW5pdHRlc3QgPSBbJy5kdW1wZXItZXJyb3InXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9pbnB1dF9vdXRwdXQucHkgYi90ZXN0cy9saWIzL3Rlc3RfaW5wdXRfb3V0cHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTk0NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfaW5wdXRfb3V0cHV0LnB5CkBAIC0wLDAgKzEsMTUwIEBACisKK2ltcG9ydCB5YW1sCitpbXBvcnQgY29kZWNzLCBpbywgdGVtcGZpbGUsIG9zLCBvcy5wYXRoCisKK2RlZiB0ZXN0X3VuaWNvZGVfaW5wdXQodW5pY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZGF0YSA9IG9wZW4odW5pY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLmRlY29kZSgndXRmLTgnKQorICAgIHZhbHVlID0gJyAnLmpvaW4oZGF0YS5zcGxpdCgpKQorICAgIG91dHB1dCA9IHlhbWwubG9hZChkYXRhKQorICAgIGFzc2VydCBvdXRwdXQgPT0gdmFsdWUsIChvdXRwdXQsIHZhbHVlKQorICAgIG91dHB1dCA9IHlhbWwubG9hZChpby5TdHJpbmdJTyhkYXRhKSkKKyAgICBhc3NlcnQgb3V0cHV0ID09IHZhbHVlLCAob3V0cHV0LCB2YWx1ZSkKKyAgICBmb3IgaW5wdXQgaW4gW2RhdGEuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjgrZGF0YS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfQkUrZGF0YS5lbmNvZGUoJ3V0Zi0xNi1iZScpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjE2X0xFK2RhdGEuZW5jb2RlKCd1dGYtMTYtbGUnKV06CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiSU5QVVQ6IiwgcmVwcihpbnB1dFs6MTBdKSwgIi4uLiIpCisgICAgICAgIG91dHB1dCA9IHlhbWwubG9hZChpbnB1dCkKKyAgICAgICAgYXNzZXJ0IG91dHB1dCA9PSB2YWx1ZSwgKG91dHB1dCwgdmFsdWUpCisgICAgICAgIG91dHB1dCA9IHlhbWwubG9hZChpby5CeXRlc0lPKGlucHV0KSkKKyAgICAgICAgYXNzZXJ0IG91dHB1dCA9PSB2YWx1ZSwgKG91dHB1dCwgdmFsdWUpCisKK3Rlc3RfdW5pY29kZV9pbnB1dC51bml0dGVzdCA9IFsnLnVuaWNvZGUnXQorCitkZWYgdGVzdF91bmljb2RlX2lucHV0X2Vycm9ycyh1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgZm9yIGlucHV0IGluIFtkYXRhLmVuY29kZSgnbGF0aW4xJywgJ2lnbm9yZScpLAorICAgICAgICAgICAgICAgICAgICBkYXRhLmVuY29kZSgndXRmLTE2LWJlJyksIGRhdGEuZW5jb2RlKCd1dGYtMTYtbGUnKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNzLkJPTV9VVEY4K2RhdGEuZW5jb2RlKCd1dGYtMTYtYmUnKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYxNl9CRStkYXRhLmVuY29kZSgndXRmLTE2LWxlJyksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfTEUrZGF0YS5lbmNvZGUoJ3V0Zi04JykrYichJ106CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlhbWwubG9hZChpbnB1dCkKKyAgICAgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlhbWwubG9hZChpby5CeXRlc0lPKGlucHV0KSkKKyAgICAgICAgZXhjZXB0IHlhbWwuWUFNTEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisKK3Rlc3RfdW5pY29kZV9pbnB1dF9lcnJvcnMudW5pdHRlc3QgPSBbJy51bmljb2RlJ10KKworZGVmIHRlc3RfdW5pY29kZV9vdXRwdXQodW5pY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZGF0YSA9IG9wZW4odW5pY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLmRlY29kZSgndXRmLTgnKQorICAgIHZhbHVlID0gJyAnLmpvaW4oZGF0YS5zcGxpdCgpKQorICAgIGZvciBhbGxvd191bmljb2RlIGluIFtGYWxzZSwgVHJ1ZV06CisgICAgICAgIGRhdGExID0geWFtbC5kdW1wKHZhbHVlLCBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBbTm9uZSwgJ3V0Zi04JywgJ3V0Zi0xNi1iZScsICd1dGYtMTYtbGUnXToKKyAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHlhbWwuZHVtcCh2YWx1ZSwgc3RyZWFtLCBlbmNvZGluZz1lbmNvZGluZywgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlKQorICAgICAgICAgICAgZGF0YTIgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgZGF0YTMgPSB5YW1sLmR1bXAodmFsdWUsIGVuY29kaW5nPWVuY29kaW5nLCBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUpCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhMywgYnl0ZXMpCisgICAgICAgICAgICAgICAgZGF0YTMgPSBkYXRhMy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBzdHJlYW0gPSBpby5CeXRlc0lPKCkKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB5YW1sLmR1bXAodmFsdWUsIHN0cmVhbSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGFsbG93X3VuaWNvZGU9YWxsb3dfdW5pY29kZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGV4YykKKyAgICAgICAgICAgICAgICAgICAgZGF0YTQgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlhbWwuZHVtcCh2YWx1ZSwgc3RyZWFtLCBlbmNvZGluZz1lbmNvZGluZywgYWxsb3dfdW5pY29kZT1hbGxvd191bmljb2RlKQorICAgICAgICAgICAgICAgIGRhdGE0ID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiQllURVM6IiwgZGF0YTRbOjUwXSkKKyAgICAgICAgICAgICAgICBkYXRhNCA9IGRhdGE0LmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIGZvciBjb3B5IGluIFtkYXRhMSwgZGF0YTIsIGRhdGEzLCBkYXRhNF06CisgICAgICAgICAgICAgICAgaWYgY29weSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvcHksIHN0cikKKyAgICAgICAgICAgICAgICBpZiBhbGxvd191bmljb2RlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5WzQ6XS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGV4YykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJleHBlY3RlZCBhbiBleGNlcHRpb24iKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvcHlbNDpdLmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YTEsIHN0ciksICh0eXBlKGRhdGExKSwgZW5jb2RpbmcpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhMiwgc3RyKSwgKHR5cGUoZGF0YTIpLCBlbmNvZGluZykKKwordGVzdF91bmljb2RlX291dHB1dC51bml0dGVzdCA9IFsnLnVuaWNvZGUnXQorCitkZWYgdGVzdF9maWxlX291dHB1dCh1bmljb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBkYXRhID0gb3Blbih1bmljb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgaGFuZGxlLCBmaWxlbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIG9zLmNsb3NlKGhhbmRsZSkKKyAgICB0cnk6CisgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgeWFtbC5kdW1wKGRhdGEsIHN0cmVhbSwgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBkYXRhMSA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHN0cmVhbSA9IGlvLkJ5dGVzSU8oKQorICAgICAgICB5YW1sLmR1bXAoZGF0YSwgc3RyZWFtLCBlbmNvZGluZz0ndXRmLTE2LWxlJywgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBkYXRhMiA9IHN0cmVhbS5nZXR2YWx1ZSgpLmRlY29kZSgndXRmLTE2LWxlJylbMTpdCisgICAgICAgIHN0cmVhbSA9IG9wZW4oZmlsZW5hbWUsICd3JywgZW5jb2Rpbmc9J3V0Zi0xNi1sZScpCisgICAgICAgIHlhbWwuZHVtcChkYXRhLCBzdHJlYW0sIGFsbG93X3VuaWNvZGU9VHJ1ZSkKKyAgICAgICAgc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgZGF0YTMgPSBvcGVuKGZpbGVuYW1lLCAncicsIGVuY29kaW5nPSd1dGYtMTYtbGUnKS5yZWFkKCkKKyAgICAgICAgc3RyZWFtID0gb3BlbihmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgeWFtbC5kdW1wKGRhdGEsIHN0cmVhbSwgZW5jb2Rpbmc9J3V0Zi04JywgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBzdHJlYW0uY2xvc2UoKQorICAgICAgICBkYXRhNCA9IG9wZW4oZmlsZW5hbWUsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykucmVhZCgpCisgICAgICAgIGFzc2VydCBkYXRhMSA9PSBkYXRhMiwgKGRhdGExLCBkYXRhMikKKyAgICAgICAgYXNzZXJ0IGRhdGExID09IGRhdGEzLCAoZGF0YTEsIGRhdGEzKQorICAgICAgICBhc3NlcnQgZGF0YTEgPT0gZGF0YTQsIChkYXRhMSwgZGF0YTQpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCit0ZXN0X2ZpbGVfb3V0cHV0LnVuaXR0ZXN0ID0gWycudW5pY29kZSddCisKK2RlZiB0ZXN0X3VuaWNvZGVfdHJhbnNmZXIodW5pY29kZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZGF0YSA9IG9wZW4odW5pY29kZV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLmRlY29kZSgndXRmLTgnKQorICAgIGZvciBlbmNvZGluZyBpbiBbTm9uZSwgJ3V0Zi04JywgJ3V0Zi0xNi1iZScsICd1dGYtMTYtbGUnXToKKyAgICAgICAgaW5wdXQgPSBkYXRhCisgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW5wdXQgPSAoJ1x1ZmVmZicraW5wdXQpLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgb3V0cHV0MSA9IHlhbWwuZW1pdCh5YW1sLnBhcnNlKGlucHV0KSwgYWxsb3dfdW5pY29kZT1UcnVlKQorICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgc3RyZWFtID0gaW8uU3RyaW5nSU8oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyZWFtID0gaW8uQnl0ZXNJTygpCisgICAgICAgIHlhbWwuZW1pdCh5YW1sLnBhcnNlKGlucHV0KSwgc3RyZWFtLCBhbGxvd191bmljb2RlPVRydWUpCisgICAgICAgIG91dHB1dDIgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXQxLCBzdHIpLCAodHlwZShvdXRwdXQxKSwgZW5jb2RpbmcpCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXQyLCBzdHIpLCAodHlwZShvdXRwdXQxKSwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXQyLCBieXRlcyksICh0eXBlKG91dHB1dDEpLCBlbmNvZGluZykKKyAgICAgICAgICAgIG91dHB1dDIuZGVjb2RlKGVuY29kaW5nKQorCit0ZXN0X3VuaWNvZGVfdHJhbnNmZXIudW5pdHRlc3QgPSBbJy51bmljb2RlJ10KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4oZ2xvYmFscygpKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfbWFyay5weSBiL3Rlc3RzL2xpYjMvdGVzdF9tYXJrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWVhMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfbWFyay5weQpAQCAtMCwwICsxLDMyIEBACisKK2ltcG9ydCB5YW1sCisKK2RlZiB0ZXN0X21hcmtzKG1hcmtzX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBpbnB1dHMgPSBvcGVuKG1hcmtzX2ZpbGVuYW1lLCAncicpLnJlYWQoKS5zcGxpdCgnLS0tXG4nKVsxOl0KKyAgICBmb3IgaW5wdXQgaW4gaW5wdXRzOgorICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgbGluZSA9IDAKKyAgICAgICAgY29sdW1uID0gMAorICAgICAgICB3aGlsZSBpbnB1dFtpbmRleF0gIT0gJyonOgorICAgICAgICAgICAgaWYgaW5wdXRbaW5kZXhdID09ICdcbic6CisgICAgICAgICAgICAgICAgbGluZSArPSAxCisgICAgICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2x1bW4gKz0gMQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICBtYXJrID0geWFtbC5NYXJrKG1hcmtzX2ZpbGVuYW1lLCBpbmRleCwgbGluZSwgY29sdW1uLCBpbnB1dCwgaW5kZXgpCisgICAgICAgIHNuaXBwZXQgPSBtYXJrLmdldF9zbmlwcGV0KGluZGVudD0yLCBtYXhfbGVuZ3RoPTc5KQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoc25pcHBldCkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoc25pcHBldCwgc3RyKSwgdHlwZShzbmlwcGV0KQorICAgICAgICBhc3NlcnQgc25pcHBldC5jb3VudCgnXG4nKSA9PSAxLCBzbmlwcGV0LmNvdW50KCdcbicpCisgICAgICAgIGRhdGEsIHBvaW50ZXIgPSBzbmlwcGV0LnNwbGl0KCdcbicpCisgICAgICAgIGFzc2VydCBsZW4oZGF0YSkgPCA4MiwgbGVuKGRhdGEpCisgICAgICAgIGFzc2VydCBkYXRhW2xlbihwb2ludGVyKS0xXSA9PSAnKicsIGRhdGFbbGVuKHBvaW50ZXIpLTFdCisKK3Rlc3RfbWFya3MudW5pdHRlc3QgPSBbJy5tYXJrcyddCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliMy90ZXN0X3JlYWRlci5weSBiL3Rlc3RzL2xpYjMvdGVzdF9yZWFkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YjM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF9yZWFkZXIucHkKQEAgLTAsMCArMSwzNCBAQAorCitpbXBvcnQgeWFtbC5yZWFkZXIKKworZGVmIF9ydW5fcmVhZGVyKGRhdGEsIHZlcmJvc2UpOgorICAgIHRyeToKKyAgICAgICAgc3RyZWFtID0geWFtbC5yZWFkZXIuUmVhZGVyKGRhdGEpCisgICAgICAgIHdoaWxlIHN0cmVhbS5wZWVrKCkgIT0gJ1wwJzoKKyAgICAgICAgICAgIHN0cmVhbS5mb3J3YXJkKCkKKyAgICBleGNlcHQgeWFtbC5yZWFkZXIuUmVhZGVyRXJyb3IgYXMgZXhjOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoZXhjKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJleHBlY3RlZCBhbiBleGNlcHRpb24iKQorCitkZWYgdGVzdF9zdHJlYW1fZXJyb3IoZXJyb3JfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIF9ydW5fcmVhZGVyKG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpLCB2ZXJib3NlKQorICAgIF9ydW5fcmVhZGVyKG9wZW4oZXJyb3JfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwgdmVyYm9zZSkKKyAgICBmb3IgZW5jb2RpbmcgaW4gWyd1dGYtOCcsICd1dGYtMTYtbGUnLCAndXRmLTE2LWJlJ106CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBvcGVuKGVycm9yX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4KKyAgICBfcnVuX3JlYWRlcihkYXRhLCB2ZXJib3NlKQorICAgIF9ydW5fcmVhZGVyKG9wZW4oZXJyb3JfZmlsZW5hbWUsIGVuY29kaW5nPWVuY29kaW5nKSwgdmVyYm9zZSkKKwordGVzdF9zdHJlYW1fZXJyb3IudW5pdHRlc3QgPSBbJy5zdHJlYW0tZXJyb3InXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9yZWN1cnNpdmUucHkgYi90ZXN0cy9saWIzL3Rlc3RfcmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWE3NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfcmVjdXJzaXZlLnB5CkBAIC0wLDAgKzEsNTEgQEAKKworaW1wb3J0IHlhbWwKKworY2xhc3MgQW5JbnN0YW5jZToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28sIGJhcik6CisgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgIHNlbGYuYmFyID0gYmFyCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiAiJXMoZm9vPSVyLCBiYXI9JXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb28sIHNlbGYuYmFyKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICIlcyhmb289Li4uLCBiYXI9Li4uKSIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCitjbGFzcyBBbkluc3RhbmNlV2l0aFN0YXRlKEFuSW5zdGFuY2UpOgorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsnYXR0cmlidXRlcyc6IFtzZWxmLmZvbywgc2VsZi5iYXJdfQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuZm9vLCBzZWxmLmJhciA9IHN0YXRlWydhdHRyaWJ1dGVzJ10KKworZGVmIHRlc3RfcmVjdXJzaXZlKHJlY3Vyc2l2ZV9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgY29udGV4dCA9IGdsb2JhbHMoKS5jb3B5KCkKKyAgICBleGVjKG9wZW4ocmVjdXJzaXZlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksIGNvbnRleHQpCisgICAgdmFsdWUxID0gY29udGV4dFsndmFsdWUnXQorICAgIG91dHB1dDEgPSBOb25lCisgICAgdmFsdWUyID0gTm9uZQorICAgIG91dHB1dDIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBvdXRwdXQxID0geWFtbC5kdW1wKHZhbHVlMSkKKyAgICAgICAgdmFsdWUyID0geWFtbC5sb2FkKG91dHB1dDEpCisgICAgICAgIG91dHB1dDIgPSB5YW1sLmR1bXAodmFsdWUyKQorICAgICAgICBhc3NlcnQgb3V0cHV0MSA9PSBvdXRwdXQyLCAob3V0cHV0MSwgb3V0cHV0MikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIlZBTFVFMToiLCB2YWx1ZTEpCisgICAgICAgICAgICBwcmludCgiVkFMVUUyOiIsIHZhbHVlMikKKyAgICAgICAgICAgIHByaW50KCJPVVRQVVQxOiIpCisgICAgICAgICAgICBwcmludChvdXRwdXQxKQorICAgICAgICAgICAgcHJpbnQoIk9VVFBVVDI6IikKKyAgICAgICAgICAgIHByaW50KG91dHB1dDIpCisKK3Rlc3RfcmVjdXJzaXZlLnVuaXR0ZXN0ID0gWycucmVjdXJzaXZlJ10KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGVzdF9hcHBsaWFuY2UKKyAgICB0ZXN0X2FwcGxpYW5jZS5ydW4oZ2xvYmFscygpKQorCmRpZmYgLS1naXQgYS90ZXN0cy9saWIzL3Rlc3RfcmVwcmVzZW50ZXIucHkgYi90ZXN0cy9saWIzL3Rlc3RfcmVwcmVzZW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkNGE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF9yZXByZXNlbnRlci5weQpAQCAtMCwwICsxLDQzIEBACisKK2ltcG9ydCB5YW1sCitpbXBvcnQgdGVzdF9jb25zdHJ1Y3RvcgoraW1wb3J0IHBwcmludAorCitkZWYgdGVzdF9yZXByZXNlbnRlcl90eXBlcyhjb2RlX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICB0ZXN0X2NvbnN0cnVjdG9yLl9tYWtlX29iamVjdHMoKQorICAgIGZvciBhbGxvd191bmljb2RlIGluIFtGYWxzZSwgVHJ1ZV06CisgICAgICAgIGZvciBlbmNvZGluZyBpbiBbJ3V0Zi04JywgJ3V0Zi0xNi1iZScsICd1dGYtMTYtbGUnXToKKyAgICAgICAgICAgIG5hdGl2ZTEgPSB0ZXN0X2NvbnN0cnVjdG9yLl9sb2FkX2NvZGUob3Blbihjb2RlX2ZpbGVuYW1lLCAncmInKS5yZWFkKCkpCisgICAgICAgICAgICBuYXRpdmUyID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG91dHB1dCA9IHlhbWwuZHVtcChuYXRpdmUxLCBEdW1wZXI9dGVzdF9jb25zdHJ1Y3Rvci5NeUR1bXBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd191bmljb2RlPWFsbG93X3VuaWNvZGUsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICAgICAgICAgIG5hdGl2ZTIgPSB5YW1sLmxvYWQob3V0cHV0LCBMb2FkZXI9dGVzdF9jb25zdHJ1Y3Rvci5NeUxvYWRlcikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hdGl2ZTEgPT0gbmF0aXZlMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHZhbHVlMSA9IHRlc3RfY29uc3RydWN0b3IuX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUxKQorICAgICAgICAgICAgICAgIHZhbHVlMiA9IHRlc3RfY29uc3RydWN0b3IuX3NlcmlhbGl6ZV92YWx1ZShuYXRpdmUyKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJTRVJJQUxJWkVEIE5BVElWRTE6IikKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQodmFsdWUxKQorICAgICAgICAgICAgICAgICAgICBwcmludCgiU0VSSUFMSVpFRCBOQVRJVkUyOiIpCisgICAgICAgICAgICAgICAgICAgIHByaW50KHZhbHVlMikKKyAgICAgICAgICAgICAgICBhc3NlcnQgdmFsdWUxID09IHZhbHVlMiwgKG5hdGl2ZTEsIG5hdGl2ZTIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJOQVRJVkUxOiIpCisgICAgICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQobmF0aXZlMSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIk5BVElWRTI6IikKKyAgICAgICAgICAgICAgICAgICAgcHByaW50LnBwcmludChuYXRpdmUyKQorICAgICAgICAgICAgICAgICAgICBwcmludCgiT1VUUFVUOiIpCisgICAgICAgICAgICAgICAgICAgIHByaW50KG91dHB1dCkKKwordGVzdF9yZXByZXNlbnRlcl90eXBlcy51bml0dGVzdCA9IFsnLmNvZGUnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9yZXNvbHZlci5weSBiL3Rlc3RzL2xpYjMvdGVzdF9yZXNvbHZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU5ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliMy90ZXN0X3Jlc29sdmVyLnB5CkBAIC0wLDAgKzEsOTIgQEAKKworaW1wb3J0IHlhbWwKK2ltcG9ydCBwcHJpbnQKKworZGVmIHRlc3RfaW1wbGljaXRfcmVzb2x2ZXIoZGF0YV9maWxlbmFtZSwgZGV0ZWN0X2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBjb3JyZWN0X3RhZyA9IE5vbmUKKyAgICBub2RlID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgY29ycmVjdF90YWcgPSBvcGVuKGRldGVjdF9maWxlbmFtZSwgJ3InKS5yZWFkKCkuc3RyaXAoKQorICAgICAgICBub2RlID0geWFtbC5jb21wb3NlKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5vZGUsIHlhbWwuU2VxdWVuY2VOb2RlKSwgbm9kZQorICAgICAgICBmb3Igc2NhbGFyIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzY2FsYXIsIHlhbWwuU2NhbGFyTm9kZSksIHNjYWxhcgorICAgICAgICAgICAgYXNzZXJ0IHNjYWxhci50YWcgPT0gY29ycmVjdF90YWcsIChzY2FsYXIudGFnLCBjb3JyZWN0X3RhZykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIkNPUlJFQ1QgVEFHOiIsIGNvcnJlY3RfdGFnKQorICAgICAgICAgICAgaWYgaGFzYXR0cihub2RlLCAndmFsdWUnKToKKyAgICAgICAgICAgICAgICBwcmludCgiQ0hJTERSRU46IikKKyAgICAgICAgICAgICAgICBwcHJpbnQucHByaW50KG5vZGUudmFsdWUpCisKK3Rlc3RfaW1wbGljaXRfcmVzb2x2ZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5kZXRlY3QnXQorCitkZWYgX21ha2VfcGF0aF9sb2FkZXJfYW5kX2R1bXBlcigpOgorICAgIGdsb2JhbCBNeUxvYWRlciwgTXlEdW1wZXIKKworICAgIGNsYXNzIE15TG9hZGVyKHlhbWwuTG9hZGVyKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzIE15RHVtcGVyKHlhbWwuRHVtcGVyKToKKyAgICAgICAgcGFzcworCisgICAgeWFtbC5hZGRfcGF0aF9yZXNvbHZlcignIXJvb3QnLCBbXSwKKyAgICAgICAgICAgIExvYWRlcj1NeUxvYWRlciwgRHVtcGVyPU15RHVtcGVyKQorICAgIHlhbWwuYWRkX3BhdGhfcmVzb2x2ZXIoJyFyb290L3NjYWxhcicsIFtdLCBzdHIsCisgICAgICAgICAgICBMb2FkZXI9TXlMb2FkZXIsIER1bXBlcj1NeUR1bXBlcikKKyAgICB5YW1sLmFkZF9wYXRoX3Jlc29sdmVyKCchcm9vdC9rZXkxMS9rZXkxMi8qJywgWydrZXkxMScsICdrZXkxMiddLAorICAgICAgICAgICAgTG9hZGVyPU15TG9hZGVyLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgeWFtbC5hZGRfcGF0aF9yZXNvbHZlcignIXJvb3Qva2V5MjEvMS8qJywgWydrZXkyMScsIDFdLAorICAgICAgICAgICAgTG9hZGVyPU15TG9hZGVyLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgeWFtbC5hZGRfcGF0aF9yZXNvbHZlcignIXJvb3Qva2V5MzEvKi8qL2tleTE0L21hcCcsIFsna2V5MzEnLCBOb25lLCBOb25lLCAna2V5MTQnXSwgZGljdCwKKyAgICAgICAgICAgIExvYWRlcj1NeUxvYWRlciwgRHVtcGVyPU15RHVtcGVyKQorCisgICAgcmV0dXJuIE15TG9hZGVyLCBNeUR1bXBlcgorCitkZWYgX2NvbnZlcnRfbm9kZShub2RlKToKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHlhbWwuU2NhbGFyTm9kZSk6CisgICAgICAgIHJldHVybiAobm9kZS50YWcsIG5vZGUudmFsdWUpCisgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIHlhbWwuU2VxdWVuY2VOb2RlKToKKyAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICBmb3IgaXRlbSBpbiBub2RlLnZhbHVlOgorICAgICAgICAgICAgdmFsdWUuYXBwZW5kKF9jb252ZXJ0X25vZGUoaXRlbSkpCisgICAgICAgIHJldHVybiAobm9kZS50YWcsIHZhbHVlKQorICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCB5YW1sLk1hcHBpbmdOb2RlKToKKyAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICBmb3Iga2V5LCBpdGVtIGluIG5vZGUudmFsdWU6CisgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoKF9jb252ZXJ0X25vZGUoa2V5KSwgX2NvbnZlcnRfbm9kZShpdGVtKSkpCisgICAgICAgIHJldHVybiAobm9kZS50YWcsIHZhbHVlKQorCitkZWYgdGVzdF9wYXRoX3Jlc29sdmVyX2xvYWRlcihkYXRhX2ZpbGVuYW1lLCBwYXRoX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBfbWFrZV9wYXRoX2xvYWRlcl9hbmRfZHVtcGVyKCkKKyAgICBub2RlczEgPSBsaXN0KHlhbWwuY29tcG9zZV9hbGwob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksIExvYWRlcj1NeUxvYWRlcikpCisgICAgbm9kZXMyID0gbGlzdCh5YW1sLmNvbXBvc2VfYWxsKG9wZW4ocGF0aF9maWxlbmFtZSwgJ3JiJykucmVhZCgpKSkKKyAgICB0cnk6CisgICAgICAgIGZvciBub2RlMSwgbm9kZTIgaW4gemlwKG5vZGVzMSwgbm9kZXMyKToKKyAgICAgICAgICAgIGRhdGExID0gX2NvbnZlcnRfbm9kZShub2RlMSkKKyAgICAgICAgICAgIGRhdGEyID0gX2NvbnZlcnRfbm9kZShub2RlMikKKyAgICAgICAgICAgIGFzc2VydCBkYXRhMSA9PSBkYXRhMiwgKGRhdGExLCBkYXRhMikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoeWFtbC5zZXJpYWxpemVfYWxsKG5vZGVzMSkpCisKK3Rlc3RfcGF0aF9yZXNvbHZlcl9sb2FkZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5wYXRoJ10KKworZGVmIHRlc3RfcGF0aF9yZXNvbHZlcl9kdW1wZXIoZGF0YV9maWxlbmFtZSwgcGF0aF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2VfcGF0aF9sb2FkZXJfYW5kX2R1bXBlcigpCisgICAgZm9yIGZpbGVuYW1lIGluIFtkYXRhX2ZpbGVuYW1lLCBwYXRoX2ZpbGVuYW1lXToKKyAgICAgICAgb3V0cHV0ID0geWFtbC5zZXJpYWxpemVfYWxsKHlhbWwuY29tcG9zZV9hbGwob3BlbihmaWxlbmFtZSwgJ3JiJykpLCBEdW1wZXI9TXlEdW1wZXIpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludChvdXRwdXQpCisgICAgICAgIG5vZGVzMSA9IHlhbWwuY29tcG9zZV9hbGwob3V0cHV0KQorICAgICAgICBub2RlczIgPSB5YW1sLmNvbXBvc2VfYWxsKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykpCisgICAgICAgIGZvciBub2RlMSwgbm9kZTIgaW4gemlwKG5vZGVzMSwgbm9kZXMyKToKKyAgICAgICAgICAgIGRhdGExID0gX2NvbnZlcnRfbm9kZShub2RlMSkKKyAgICAgICAgICAgIGRhdGEyID0gX2NvbnZlcnRfbm9kZShub2RlMikKKyAgICAgICAgICAgIGFzc2VydCBkYXRhMSA9PSBkYXRhMiwgKGRhdGExLCBkYXRhMikKKwordGVzdF9wYXRoX3Jlc29sdmVyX2R1bXBlci51bml0dGVzdCA9IFsnLmRhdGEnLCAnLnBhdGgnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF9zdHJ1Y3R1cmUucHkgYi90ZXN0cy9saWIzL3Rlc3Rfc3RydWN0dXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNmY1OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3Rfc3RydWN0dXJlLnB5CkBAIC0wLDAgKzEsMTg3IEBACisKK2ltcG9ydCB5YW1sLCBjYW5vbmljYWwKK2ltcG9ydCBwcHJpbnQKKworZGVmIF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpOgorICAgIGlmIGxvYWRlci5jaGVja19ldmVudCh5YW1sLlNjYWxhckV2ZW50KToKKyAgICAgICAgZXZlbnQgPSBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICAgICAgaWYgZXZlbnQudGFnIG9yIGV2ZW50LmFuY2hvciBvciBldmVudC52YWx1ZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsaWYgbG9hZGVyLmNoZWNrX2V2ZW50KHlhbWwuU2VxdWVuY2VTdGFydEV2ZW50KToKKyAgICAgICAgbG9hZGVyLmdldF9ldmVudCgpCisgICAgICAgIHNlcXVlbmNlID0gW10KKyAgICAgICAgd2hpbGUgbm90IGxvYWRlci5jaGVja19ldmVudCh5YW1sLlNlcXVlbmNlRW5kRXZlbnQpOgorICAgICAgICAgICAgc2VxdWVuY2UuYXBwZW5kKF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpKQorICAgICAgICBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICAgICAgcmV0dXJuIHNlcXVlbmNlCisgICAgZWxpZiBsb2FkZXIuY2hlY2tfZXZlbnQoeWFtbC5NYXBwaW5nU3RhcnRFdmVudCk6CisgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICBtYXBwaW5nID0gW10KKyAgICAgICAgd2hpbGUgbm90IGxvYWRlci5jaGVja19ldmVudCh5YW1sLk1hcHBpbmdFbmRFdmVudCk6CisgICAgICAgICAgICBrZXkgPSBfY29udmVydF9zdHJ1Y3R1cmUobG9hZGVyKQorICAgICAgICAgICAgdmFsdWUgPSBfY29udmVydF9zdHJ1Y3R1cmUobG9hZGVyKQorICAgICAgICAgICAgbWFwcGluZy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICAgICAgcmV0dXJuIG1hcHBpbmcKKyAgICBlbGlmIGxvYWRlci5jaGVja19ldmVudCh5YW1sLkFsaWFzRXZlbnQpOgorICAgICAgICBsb2FkZXIuZ2V0X2V2ZW50KCkKKyAgICAgICAgcmV0dXJuICcqJworICAgIGVsc2U6CisgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICByZXR1cm4gJz8nCisKK2RlZiB0ZXN0X3N0cnVjdHVyZShkYXRhX2ZpbGVuYW1lLCBzdHJ1Y3R1cmVfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIG5vZGVzMSA9IFtdCisgICAgbm9kZXMyID0gZXZhbChvcGVuKHN0cnVjdHVyZV9maWxlbmFtZSwgJ3InKS5yZWFkKCkpCisgICAgdHJ5OgorICAgICAgICBsb2FkZXIgPSB5YW1sLkxvYWRlcihvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKQorICAgICAgICB3aGlsZSBsb2FkZXIuY2hlY2tfZXZlbnQoKToKKyAgICAgICAgICAgIGlmIGxvYWRlci5jaGVja19ldmVudCh5YW1sLlN0cmVhbVN0YXJ0RXZlbnQsIHlhbWwuU3RyZWFtRW5kRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhbWwuRG9jdW1lbnRTdGFydEV2ZW50LCB5YW1sLkRvY3VtZW50RW5kRXZlbnQpOgorICAgICAgICAgICAgICAgIGxvYWRlci5nZXRfZXZlbnQoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBub2RlczEuYXBwZW5kKF9jb252ZXJ0X3N0cnVjdHVyZShsb2FkZXIpKQorICAgICAgICBpZiBsZW4obm9kZXMxKSA9PSAxOgorICAgICAgICAgICAgbm9kZXMxID0gbm9kZXMxWzBdCisgICAgICAgIGFzc2VydCBub2RlczEgPT0gbm9kZXMyLCAobm9kZXMxLCBub2RlczIpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJOT0RFUzE6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQobm9kZXMxKQorICAgICAgICAgICAgcHJpbnQoIk5PREVTMjoiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChub2RlczIpCisKK3Rlc3Rfc3RydWN0dXJlLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuc3RydWN0dXJlJ10KKworZGVmIF9jb21wYXJlX2V2ZW50cyhldmVudHMxLCBldmVudHMyLCBmdWxsPUZhbHNlKToKKyAgICBhc3NlcnQgbGVuKGV2ZW50czEpID09IGxlbihldmVudHMyKSwgKGxlbihldmVudHMxKSwgbGVuKGV2ZW50czIpKQorICAgIGZvciBldmVudDEsIGV2ZW50MiBpbiB6aXAoZXZlbnRzMSwgZXZlbnRzMik6CisgICAgICAgIGFzc2VydCBldmVudDEuX19jbGFzc19fID09IGV2ZW50Mi5fX2NsYXNzX18sIChldmVudDEsIGV2ZW50MikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudDEsIHlhbWwuQWxpYXNFdmVudCkgYW5kIGZ1bGw6CisgICAgICAgICAgICBhc3NlcnQgZXZlbnQxLmFuY2hvciA9PSBldmVudDIuYW5jaG9yLCAoZXZlbnQxLCBldmVudDIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQxLCAoeWFtbC5TY2FsYXJFdmVudCwgeWFtbC5Db2xsZWN0aW9uU3RhcnRFdmVudCkpOgorICAgICAgICAgICAgaWYgKGV2ZW50MS50YWcgbm90IGluIFtOb25lLCAnISddIGFuZCBldmVudDIudGFnIG5vdCBpbiBbTm9uZSwgJyEnXSkgb3IgZnVsbDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgZXZlbnQxLnRhZyA9PSBldmVudDIudGFnLCAoZXZlbnQxLCBldmVudDIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQxLCB5YW1sLlNjYWxhckV2ZW50KToKKyAgICAgICAgICAgIGFzc2VydCBldmVudDEudmFsdWUgPT0gZXZlbnQyLnZhbHVlLCAoZXZlbnQxLCBldmVudDIpCisKK2RlZiB0ZXN0X3BhcnNlcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGV2ZW50czEgPSBOb25lCisgICAgZXZlbnRzMiA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGV2ZW50czEgPSBsaXN0KHlhbWwucGFyc2Uob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIGV2ZW50czIgPSBsaXN0KHlhbWwuY2Fub25pY2FsX3BhcnNlKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIF9jb21wYXJlX2V2ZW50cyhldmVudHMxLCBldmVudHMyKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiRVZFTlRTMToiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChldmVudHMxKQorICAgICAgICAgICAgcHJpbnQoIkVWRU5UUzI6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQoZXZlbnRzMikKKwordGVzdF9wYXJzZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQorCitkZWYgdGVzdF9wYXJzZXJfb25fY2Fub25pY2FsKGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgZXZlbnRzMSA9IE5vbmUKKyAgICBldmVudHMyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgZXZlbnRzMSA9IGxpc3QoeWFtbC5wYXJzZShvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykpKQorICAgICAgICBldmVudHMyID0gbGlzdCh5YW1sLmNhbm9uaWNhbF9wYXJzZShvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykpKQorICAgICAgICBfY29tcGFyZV9ldmVudHMoZXZlbnRzMSwgZXZlbnRzMiwgZnVsbD1UcnVlKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiRVZFTlRTMToiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChldmVudHMxKQorICAgICAgICAgICAgcHJpbnQoIkVWRU5UUzI6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQoZXZlbnRzMikKKwordGVzdF9wYXJzZXJfb25fY2Fub25pY2FsLnVuaXR0ZXN0ID0gWycuY2Fub25pY2FsJ10KKworZGVmIF9jb21wYXJlX25vZGVzKG5vZGUxLCBub2RlMik6CisgICAgYXNzZXJ0IG5vZGUxLl9fY2xhc3NfXyA9PSBub2RlMi5fX2NsYXNzX18sIChub2RlMSwgbm9kZTIpCisgICAgYXNzZXJ0IG5vZGUxLnRhZyA9PSBub2RlMi50YWcsIChub2RlMSwgbm9kZTIpCisgICAgaWYgaXNpbnN0YW5jZShub2RlMSwgeWFtbC5TY2FsYXJOb2RlKToKKyAgICAgICAgYXNzZXJ0IG5vZGUxLnZhbHVlID09IG5vZGUyLnZhbHVlLCAobm9kZTEsIG5vZGUyKQorICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBsZW4obm9kZTEudmFsdWUpID09IGxlbihub2RlMi52YWx1ZSksIChub2RlMSwgbm9kZTIpCisgICAgICAgIGZvciBpdGVtMSwgaXRlbTIgaW4gemlwKG5vZGUxLnZhbHVlLCBub2RlMi52YWx1ZSk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtMSwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGl0ZW0xID0gKGl0ZW0xLCkKKyAgICAgICAgICAgICAgICBpdGVtMiA9IChpdGVtMiwpCisgICAgICAgICAgICBmb3Igc3Vibm9kZTEsIHN1Ym5vZGUyIGluIHppcChpdGVtMSwgaXRlbTIpOgorICAgICAgICAgICAgICAgIF9jb21wYXJlX25vZGVzKHN1Ym5vZGUxLCBzdWJub2RlMikKKworZGVmIHRlc3RfY29tcG9zZXIoZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBub2RlczEgPSBOb25lCisgICAgbm9kZXMyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgbm9kZXMxID0gbGlzdCh5YW1sLmNvbXBvc2VfYWxsKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykpKQorICAgICAgICBub2RlczIgPSBsaXN0KHlhbWwuY2Fub25pY2FsX2NvbXBvc2VfYWxsKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSkpCisgICAgICAgIGFzc2VydCBsZW4obm9kZXMxKSA9PSBsZW4obm9kZXMyKSwgKGxlbihub2RlczEpLCBsZW4obm9kZXMyKSkKKyAgICAgICAgZm9yIG5vZGUxLCBub2RlMiBpbiB6aXAobm9kZXMxLCBub2RlczIpOgorICAgICAgICAgICAgX2NvbXBhcmVfbm9kZXMobm9kZTEsIG5vZGUyKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiTk9ERVMxOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KG5vZGVzMSkKKyAgICAgICAgICAgIHByaW50KCJOT0RFUzI6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQobm9kZXMyKQorCit0ZXN0X2NvbXBvc2VyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KKworZGVmIF9tYWtlX2xvYWRlcigpOgorICAgIGdsb2JhbCBNeUxvYWRlcgorCisgICAgY2xhc3MgTXlMb2FkZXIoeWFtbC5Mb2FkZXIpOgorICAgICAgICBkZWYgY29uc3RydWN0X3NlcXVlbmNlKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHlhbWwuTG9hZGVyLmNvbnN0cnVjdF9zZXF1ZW5jZShzZWxmLCBub2RlKSkKKyAgICAgICAgZGVmIGNvbnN0cnVjdF9tYXBwaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcGFpcnMgPSBzZWxmLmNvbnN0cnVjdF9wYWlycyhub2RlKQorICAgICAgICAgICAgcGFpcnMuc29ydChrZXk9KGxhbWJkYSBpOiBzdHIoaSkpKQorICAgICAgICAgICAgcmV0dXJuIHBhaXJzCisgICAgICAgIGRlZiBjb25zdHJ1Y3RfdW5kZWZpbmVkKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0X3NjYWxhcihub2RlKQorCisgICAgTXlMb2FkZXIuYWRkX2NvbnN0cnVjdG9yKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCBNeUxvYWRlci5jb25zdHJ1Y3RfbWFwcGluZykKKyAgICBNeUxvYWRlci5hZGRfY29uc3RydWN0b3IoTm9uZSwgTXlMb2FkZXIuY29uc3RydWN0X3VuZGVmaW5lZCkKKworZGVmIF9tYWtlX2Nhbm9uaWNhbF9sb2FkZXIoKToKKyAgICBnbG9iYWwgTXlDYW5vbmljYWxMb2FkZXIKKworICAgIGNsYXNzIE15Q2Fub25pY2FsTG9hZGVyKHlhbWwuQ2Fub25pY2FsTG9hZGVyKToKKyAgICAgICAgZGVmIGNvbnN0cnVjdF9zZXF1ZW5jZShzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHJldHVybiB0dXBsZSh5YW1sLkNhbm9uaWNhbExvYWRlci5jb25zdHJ1Y3Rfc2VxdWVuY2Uoc2VsZiwgbm9kZSkpCisgICAgICAgIGRlZiBjb25zdHJ1Y3RfbWFwcGluZyhzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHBhaXJzID0gc2VsZi5jb25zdHJ1Y3RfcGFpcnMobm9kZSkKKyAgICAgICAgICAgIHBhaXJzLnNvcnQoa2V5PShsYW1iZGEgaTogc3RyKGkpKSkKKyAgICAgICAgICAgIHJldHVybiBwYWlycworICAgICAgICBkZWYgY29uc3RydWN0X3VuZGVmaW5lZChzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdF9zY2FsYXIobm9kZSkKKworICAgIE15Q2Fub25pY2FsTG9hZGVyLmFkZF9jb25zdHJ1Y3RvcigndGFnOnlhbWwub3JnLDIwMDI6bWFwJywgTXlDYW5vbmljYWxMb2FkZXIuY29uc3RydWN0X21hcHBpbmcpCisgICAgTXlDYW5vbmljYWxMb2FkZXIuYWRkX2NvbnN0cnVjdG9yKE5vbmUsIE15Q2Fub25pY2FsTG9hZGVyLmNvbnN0cnVjdF91bmRlZmluZWQpCisKK2RlZiB0ZXN0X2NvbnN0cnVjdG9yKGRhdGFfZmlsZW5hbWUsIGNhbm9uaWNhbF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgX21ha2VfbG9hZGVyKCkKKyAgICBfbWFrZV9jYW5vbmljYWxfbG9hZGVyKCkKKyAgICBuYXRpdmUxID0gTm9uZQorICAgIG5hdGl2ZTIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBuYXRpdmUxID0gbGlzdCh5YW1sLmxvYWRfYWxsKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksIExvYWRlcj1NeUxvYWRlcikpCisgICAgICAgIG5hdGl2ZTIgPSBsaXN0KHlhbWwubG9hZF9hbGwob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLCBMb2FkZXI9TXlDYW5vbmljYWxMb2FkZXIpKQorICAgICAgICBhc3NlcnQgbmF0aXZlMSA9PSBuYXRpdmUyLCAobmF0aXZlMSwgbmF0aXZlMikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIk5BVElWRTE6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQobmF0aXZlMSkKKyAgICAgICAgICAgIHByaW50KCJOQVRJVkUyOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KG5hdGl2ZTIpCisKK3Rlc3RfY29uc3RydWN0b3IudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF90b2tlbnMucHkgYi90ZXN0cy9saWIzL3Rlc3RfdG9rZW5zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODk0NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfdG9rZW5zLnB5CkBAIC0wLDAgKzEsNzcgQEAKKworaW1wb3J0IHlhbWwKK2ltcG9ydCBwcHJpbnQKKworIyBUb2tlbnMgbW5lbW9uaWM6CisjIGRpcmVjdGl2ZTogICAgICAgICAgICAlCisjIGRvY3VtZW50X3N0YXJ0OiAgICAgICAtLS0KKyMgZG9jdW1lbnRfZW5kOiAgICAgICAgIC4uLgorIyBhbGlhczogICAgICAgICAgICAgICAgKgorIyBhbmNob3I6ICAgICAgICAgICAgICAgJgorIyB0YWc6ICAgICAgICAgICAgICAgICAgIQorIyBzY2FsYXIgICAgICAgICAgICAgICAgXworIyBibG9ja19zZXF1ZW5jZV9zdGFydDogW1sKKyMgYmxvY2tfbWFwcGluZ19zdGFydDogIHt7CisjIGJsb2NrX2VuZDogICAgICAgICAgICBdfQorIyBmbG93X3NlcXVlbmNlX3N0YXJ0OiAgWworIyBmbG93X3NlcXVlbmNlX2VuZDogICAgXQorIyBmbG93X21hcHBpbmdfc3RhcnQ6ICAgeworIyBmbG93X21hcHBpbmdfZW5kOiAgICAgfQorIyBlbnRyeTogICAgICAgICAgICAgICAgLAorIyBrZXk6ICAgICAgICAgICAgICAgICAgPworIyB2YWx1ZTogICAgICAgICAgICAgICAgOgorCitfcmVwbGFjZXMgPSB7CisgICAgeWFtbC5EaXJlY3RpdmVUb2tlbjogJyUnLAorICAgIHlhbWwuRG9jdW1lbnRTdGFydFRva2VuOiAnLS0tJywKKyAgICB5YW1sLkRvY3VtZW50RW5kVG9rZW46ICcuLi4nLAorICAgIHlhbWwuQWxpYXNUb2tlbjogJyonLAorICAgIHlhbWwuQW5jaG9yVG9rZW46ICcmJywKKyAgICB5YW1sLlRhZ1Rva2VuOiAnIScsCisgICAgeWFtbC5TY2FsYXJUb2tlbjogJ18nLAorICAgIHlhbWwuQmxvY2tTZXF1ZW5jZVN0YXJ0VG9rZW46ICdbWycsCisgICAgeWFtbC5CbG9ja01hcHBpbmdTdGFydFRva2VuOiAne3snLAorICAgIHlhbWwuQmxvY2tFbmRUb2tlbjogJ119JywKKyAgICB5YW1sLkZsb3dTZXF1ZW5jZVN0YXJ0VG9rZW46ICdbJywKKyAgICB5YW1sLkZsb3dTZXF1ZW5jZUVuZFRva2VuOiAnXScsCisgICAgeWFtbC5GbG93TWFwcGluZ1N0YXJ0VG9rZW46ICd7JywKKyAgICB5YW1sLkZsb3dNYXBwaW5nRW5kVG9rZW46ICd9JywKKyAgICB5YW1sLkJsb2NrRW50cnlUb2tlbjogJywnLAorICAgIHlhbWwuRmxvd0VudHJ5VG9rZW46ICcsJywKKyAgICB5YW1sLktleVRva2VuOiAnPycsCisgICAgeWFtbC5WYWx1ZVRva2VuOiAnOicsCit9CisKK2RlZiB0ZXN0X3Rva2VucyhkYXRhX2ZpbGVuYW1lLCB0b2tlbnNfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIHRva2VuczEgPSBbXQorICAgIHRva2VuczIgPSBvcGVuKHRva2Vuc19maWxlbmFtZSwgJ3InKS5yZWFkKCkuc3BsaXQoKQorICAgIHRyeToKKyAgICAgICAgZm9yIHRva2VuIGluIHlhbWwuc2NhbihvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRva2VuLCAoeWFtbC5TdHJlYW1TdGFydFRva2VuLCB5YW1sLlN0cmVhbUVuZFRva2VuKSk6CisgICAgICAgICAgICAgICAgdG9rZW5zMS5hcHBlbmQoX3JlcGxhY2VzW3Rva2VuLl9fY2xhc3NfX10pCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJUT0tFTlMxOiIsICcgJy5qb2luKHRva2VuczEpKQorICAgICAgICAgICAgcHJpbnQoIlRPS0VOUzI6IiwgJyAnLmpvaW4odG9rZW5zMikpCisgICAgYXNzZXJ0IGxlbih0b2tlbnMxKSA9PSBsZW4odG9rZW5zMiksICh0b2tlbnMxLCB0b2tlbnMyKQorICAgIGZvciB0b2tlbjEsIHRva2VuMiBpbiB6aXAodG9rZW5zMSwgdG9rZW5zMik6CisgICAgICAgIGFzc2VydCB0b2tlbjEgPT0gdG9rZW4yLCAodG9rZW4xLCB0b2tlbjIpCisKK3Rlc3RfdG9rZW5zLnVuaXR0ZXN0ID0gWycuZGF0YScsICcudG9rZW5zJ10KKworZGVmIHRlc3Rfc2Nhbm5lcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIGZvciBmaWxlbmFtZSBpbiBbZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lXToKKyAgICAgICAgdG9rZW5zID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHRva2VuIGluIHlhbWwuc2NhbihvcGVuKGZpbGVuYW1lLCAncmInKSk6CisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZCh0b2tlbi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQodG9rZW5zKQorCit0ZXN0X3NjYW5uZXIudW5pdHRlc3QgPSBbJy5kYXRhJywgJy5jYW5vbmljYWwnXQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYjMvdGVzdF95YW1sLnB5IGIvdGVzdHMvbGliMy90ZXN0X3lhbWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNzM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYjMvdGVzdF95YW1sLnB5CkBAIC0wLDAgKzEsMTggQEAKKworZnJvbSB0ZXN0X21hcmsgaW1wb3J0ICoKK2Zyb20gdGVzdF9yZWFkZXIgaW1wb3J0ICoKK2Zyb20gdGVzdF9jYW5vbmljYWwgaW1wb3J0ICoKK2Zyb20gdGVzdF90b2tlbnMgaW1wb3J0ICoKK2Zyb20gdGVzdF9zdHJ1Y3R1cmUgaW1wb3J0ICoKK2Zyb20gdGVzdF9lcnJvcnMgaW1wb3J0ICoKK2Zyb20gdGVzdF9yZXNvbHZlciBpbXBvcnQgKgorZnJvbSB0ZXN0X2NvbnN0cnVjdG9yIGltcG9ydCAqCitmcm9tIHRlc3RfZW1pdHRlciBpbXBvcnQgKgorZnJvbSB0ZXN0X3JlcHJlc2VudGVyIGltcG9ydCAqCitmcm9tIHRlc3RfcmVjdXJzaXZlIGltcG9ydCAqCitmcm9tIHRlc3RfaW5wdXRfb3V0cHV0IGltcG9ydCAqCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHRlc3RfYXBwbGlhbmNlCisgICAgdGVzdF9hcHBsaWFuY2UucnVuKGdsb2JhbHMoKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliMy90ZXN0X3lhbWxfZXh0LnB5IGIvdGVzdHMvbGliMy90ZXN0X3lhbWxfZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDM5N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIzL3Rlc3RfeWFtbF9leHQucHkKQEAgLTAsMCArMSwyNzEgQEAKKworaW1wb3J0IF95YW1sLCB5YW1sCitpbXBvcnQgdHlwZXMsIHBwcmludAorCit5YW1sLlB5QmFzZUxvYWRlciA9IHlhbWwuQmFzZUxvYWRlcgoreWFtbC5QeVNhZmVMb2FkZXIgPSB5YW1sLlNhZmVMb2FkZXIKK3lhbWwuUHlMb2FkZXIgPSB5YW1sLkxvYWRlcgoreWFtbC5QeUJhc2VEdW1wZXIgPSB5YW1sLkJhc2VEdW1wZXIKK3lhbWwuUHlTYWZlRHVtcGVyID0geWFtbC5TYWZlRHVtcGVyCit5YW1sLlB5RHVtcGVyID0geWFtbC5EdW1wZXIKKworb2xkX3NjYW4gPSB5YW1sLnNjYW4KK2RlZiBuZXdfc2NhbihzdHJlYW0sIExvYWRlcj15YW1sLkNMb2FkZXIpOgorICAgIHJldHVybiBvbGRfc2NhbihzdHJlYW0sIExvYWRlcikKKworb2xkX3BhcnNlID0geWFtbC5wYXJzZQorZGVmIG5ld19wYXJzZShzdHJlYW0sIExvYWRlcj15YW1sLkNMb2FkZXIpOgorICAgIHJldHVybiBvbGRfcGFyc2Uoc3RyZWFtLCBMb2FkZXIpCisKK29sZF9jb21wb3NlID0geWFtbC5jb21wb3NlCitkZWYgbmV3X2NvbXBvc2Uoc3RyZWFtLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICByZXR1cm4gb2xkX2NvbXBvc2Uoc3RyZWFtLCBMb2FkZXIpCisKK29sZF9jb21wb3NlX2FsbCA9IHlhbWwuY29tcG9zZV9hbGwKK2RlZiBuZXdfY29tcG9zZV9hbGwoc3RyZWFtLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICByZXR1cm4gb2xkX2NvbXBvc2VfYWxsKHN0cmVhbSwgTG9hZGVyKQorCitvbGRfbG9hZCA9IHlhbWwubG9hZAorZGVmIG5ld19sb2FkKHN0cmVhbSwgTG9hZGVyPXlhbWwuQ0xvYWRlcik6CisgICAgcmV0dXJuIG9sZF9sb2FkKHN0cmVhbSwgTG9hZGVyKQorCitvbGRfbG9hZF9hbGwgPSB5YW1sLmxvYWRfYWxsCitkZWYgbmV3X2xvYWRfYWxsKHN0cmVhbSwgTG9hZGVyPXlhbWwuQ0xvYWRlcik6CisgICAgcmV0dXJuIG9sZF9sb2FkX2FsbChzdHJlYW0sIExvYWRlcikKKworb2xkX3NhZmVfbG9hZCA9IHlhbWwuc2FmZV9sb2FkCitkZWYgbmV3X3NhZmVfbG9hZChzdHJlYW0pOgorICAgIHJldHVybiBvbGRfbG9hZChzdHJlYW0sIHlhbWwuQ1NhZmVMb2FkZXIpCisKK29sZF9zYWZlX2xvYWRfYWxsID0geWFtbC5zYWZlX2xvYWRfYWxsCitkZWYgbmV3X3NhZmVfbG9hZF9hbGwoc3RyZWFtKToKKyAgICByZXR1cm4gb2xkX2xvYWRfYWxsKHN0cmVhbSwgeWFtbC5DU2FmZUxvYWRlcikKKworb2xkX2VtaXQgPSB5YW1sLmVtaXQKK2RlZiBuZXdfZW1pdChldmVudHMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZW1pdChldmVudHMsIHN0cmVhbSwgRHVtcGVyLCAqKmt3ZHMpCisKK29sZF9zZXJpYWxpemUgPSB5YW1sLnNlcmlhbGl6ZQorZGVmIG5ld19zZXJpYWxpemUobm9kZSwgc3RyZWFtLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfc2VyaWFsaXplKG5vZGUsIHN0cmVhbSwgRHVtcGVyLCAqKmt3ZHMpCisKK29sZF9zZXJpYWxpemVfYWxsID0geWFtbC5zZXJpYWxpemVfYWxsCitkZWYgbmV3X3NlcmlhbGl6ZV9hbGwobm9kZXMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfc2VyaWFsaXplX2FsbChub2Rlcywgc3RyZWFtLCBEdW1wZXIsICoqa3dkcykKKworb2xkX2R1bXAgPSB5YW1sLmR1bXAKK2RlZiBuZXdfZHVtcChkYXRhLCBzdHJlYW09Tm9uZSwgRHVtcGVyPXlhbWwuQ0R1bXBlciwgKiprd2RzKToKKyAgICByZXR1cm4gb2xkX2R1bXAoZGF0YSwgc3RyZWFtLCBEdW1wZXIsICoqa3dkcykKKworb2xkX2R1bXBfYWxsID0geWFtbC5kdW1wX2FsbAorZGVmIG5ld19kdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCBEdW1wZXI9eWFtbC5DRHVtcGVyLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW0sIER1bXBlciwgKiprd2RzKQorCitvbGRfc2FmZV9kdW1wID0geWFtbC5zYWZlX2R1bXAKK2RlZiBuZXdfc2FmZV9kdW1wKGRhdGEsIHN0cmVhbT1Ob25lLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcChkYXRhLCBzdHJlYW0sIHlhbWwuQ1NhZmVEdW1wZXIsICoqa3dkcykKKworb2xkX3NhZmVfZHVtcF9hbGwgPSB5YW1sLnNhZmVfZHVtcF9hbGwKK2RlZiBuZXdfc2FmZV9kdW1wX2FsbChkb2N1bWVudHMsIHN0cmVhbT1Ob25lLCAqKmt3ZHMpOgorICAgIHJldHVybiBvbGRfZHVtcF9hbGwoZG9jdW1lbnRzLCBzdHJlYW0sIHlhbWwuQ1NhZmVEdW1wZXIsICoqa3dkcykKKworZGVmIF9zZXRfdXAoKToKKyAgICB5YW1sLkJhc2VMb2FkZXIgPSB5YW1sLkNCYXNlTG9hZGVyCisgICAgeWFtbC5TYWZlTG9hZGVyID0geWFtbC5DU2FmZUxvYWRlcgorICAgIHlhbWwuTG9hZGVyID0geWFtbC5DTG9hZGVyCisgICAgeWFtbC5CYXNlRHVtcGVyID0geWFtbC5DQmFzZUR1bXBlcgorICAgIHlhbWwuU2FmZUR1bXBlciA9IHlhbWwuQ1NhZmVEdW1wZXIKKyAgICB5YW1sLkR1bXBlciA9IHlhbWwuQ0R1bXBlcgorICAgIHlhbWwuc2NhbiA9IG5ld19zY2FuCisgICAgeWFtbC5wYXJzZSA9IG5ld19wYXJzZQorICAgIHlhbWwuY29tcG9zZSA9IG5ld19jb21wb3NlCisgICAgeWFtbC5jb21wb3NlX2FsbCA9IG5ld19jb21wb3NlX2FsbAorICAgIHlhbWwubG9hZCA9IG5ld19sb2FkCisgICAgeWFtbC5sb2FkX2FsbCA9IG5ld19sb2FkX2FsbAorICAgIHlhbWwuc2FmZV9sb2FkID0gbmV3X3NhZmVfbG9hZAorICAgIHlhbWwuc2FmZV9sb2FkX2FsbCA9IG5ld19zYWZlX2xvYWRfYWxsCisgICAgeWFtbC5lbWl0ID0gbmV3X2VtaXQKKyAgICB5YW1sLnNlcmlhbGl6ZSA9IG5ld19zZXJpYWxpemUKKyAgICB5YW1sLnNlcmlhbGl6ZV9hbGwgPSBuZXdfc2VyaWFsaXplX2FsbAorICAgIHlhbWwuZHVtcCA9IG5ld19kdW1wCisgICAgeWFtbC5kdW1wX2FsbCA9IG5ld19kdW1wX2FsbAorICAgIHlhbWwuc2FmZV9kdW1wID0gbmV3X3NhZmVfZHVtcAorICAgIHlhbWwuc2FmZV9kdW1wX2FsbCA9IG5ld19zYWZlX2R1bXBfYWxsCisKK2RlZiBfdGVhcl9kb3duKCk6CisgICAgeWFtbC5CYXNlTG9hZGVyID0geWFtbC5QeUJhc2VMb2FkZXIKKyAgICB5YW1sLlNhZmVMb2FkZXIgPSB5YW1sLlB5U2FmZUxvYWRlcgorICAgIHlhbWwuTG9hZGVyID0geWFtbC5QeUxvYWRlcgorICAgIHlhbWwuQmFzZUR1bXBlciA9IHlhbWwuUHlCYXNlRHVtcGVyCisgICAgeWFtbC5TYWZlRHVtcGVyID0geWFtbC5QeVNhZmVEdW1wZXIKKyAgICB5YW1sLkR1bXBlciA9IHlhbWwuUHlEdW1wZXIKKyAgICB5YW1sLnNjYW4gPSBvbGRfc2NhbgorICAgIHlhbWwucGFyc2UgPSBvbGRfcGFyc2UKKyAgICB5YW1sLmNvbXBvc2UgPSBvbGRfY29tcG9zZQorICAgIHlhbWwuY29tcG9zZV9hbGwgPSBvbGRfY29tcG9zZV9hbGwKKyAgICB5YW1sLmxvYWQgPSBvbGRfbG9hZAorICAgIHlhbWwubG9hZF9hbGwgPSBvbGRfbG9hZF9hbGwKKyAgICB5YW1sLnNhZmVfbG9hZCA9IG9sZF9zYWZlX2xvYWQKKyAgICB5YW1sLnNhZmVfbG9hZF9hbGwgPSBvbGRfc2FmZV9sb2FkX2FsbAorICAgIHlhbWwuZW1pdCA9IG9sZF9lbWl0CisgICAgeWFtbC5zZXJpYWxpemUgPSBvbGRfc2VyaWFsaXplCisgICAgeWFtbC5zZXJpYWxpemVfYWxsID0gb2xkX3NlcmlhbGl6ZV9hbGwKKyAgICB5YW1sLmR1bXAgPSBvbGRfZHVtcAorICAgIHlhbWwuZHVtcF9hbGwgPSBvbGRfZHVtcF9hbGwKKyAgICB5YW1sLnNhZmVfZHVtcCA9IG9sZF9zYWZlX2R1bXAKKyAgICB5YW1sLnNhZmVfZHVtcF9hbGwgPSBvbGRfc2FmZV9kdW1wX2FsbAorCitkZWYgdGVzdF9jX3ZlcnNpb24odmVyYm9zZT1GYWxzZSk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQoX3lhbWwuZ2V0X3ZlcnNpb24oKSkKKyAgICAgICAgcHJpbnQoX3lhbWwuZ2V0X3ZlcnNpb25fc3RyaW5nKCkpCisgICAgYXNzZXJ0ICgiJXMuJXMuJXMiICUgX3lhbWwuZ2V0X3ZlcnNpb24oKSkgPT0gX3lhbWwuZ2V0X3ZlcnNpb25fc3RyaW5nKCksICAgIFwKKyAgICAgICAgICAgIChfeWFtbC5nZXRfdmVyc2lvbigpLCBfeWFtbC5nZXRfdmVyc2lvbl9zdHJpbmcoKSkKKworZGVmIF9jb21wYXJlX3NjYW5uZXJzKHB5X2RhdGEsIGNfZGF0YSwgdmVyYm9zZSk6CisgICAgcHlfdG9rZW5zID0gbGlzdCh5YW1sLnNjYW4ocHlfZGF0YSwgTG9hZGVyPXlhbWwuUHlMb2FkZXIpKQorICAgIGNfdG9rZW5zID0gW10KKyAgICB0cnk6CisgICAgICAgIGZvciB0b2tlbiBpbiB5YW1sLnNjYW4oY19kYXRhLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICAgICAgICAgIGNfdG9rZW5zLmFwcGVuZCh0b2tlbikKKyAgICAgICAgYXNzZXJ0IGxlbihweV90b2tlbnMpID09IGxlbihjX3Rva2VucyksIChsZW4ocHlfdG9rZW5zKSwgbGVuKGNfdG9rZW5zKSkKKyAgICAgICAgZm9yIHB5X3Rva2VuLCBjX3Rva2VuIGluIHppcChweV90b2tlbnMsIGNfdG9rZW5zKToKKyAgICAgICAgICAgIGFzc2VydCBweV90b2tlbi5fX2NsYXNzX18gPT0gY190b2tlbi5fX2NsYXNzX18sIChweV90b2tlbiwgY190b2tlbikKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocHlfdG9rZW4sICd2YWx1ZScpOgorICAgICAgICAgICAgICAgIGFzc2VydCBweV90b2tlbi52YWx1ZSA9PSBjX3Rva2VuLnZhbHVlLCAocHlfdG9rZW4sIGNfdG9rZW4pCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHB5X3Rva2VuLCB5YW1sLlN0cmVhbUVuZFRva2VuKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHlfc3RhcnQgPSAocHlfdG9rZW4uc3RhcnRfbWFyay5pbmRleCwgcHlfdG9rZW4uc3RhcnRfbWFyay5saW5lLCBweV90b2tlbi5zdGFydF9tYXJrLmNvbHVtbikKKyAgICAgICAgICAgIHB5X2VuZCA9IChweV90b2tlbi5lbmRfbWFyay5pbmRleCwgcHlfdG9rZW4uZW5kX21hcmsubGluZSwgcHlfdG9rZW4uZW5kX21hcmsuY29sdW1uKQorICAgICAgICAgICAgY19zdGFydCA9IChjX3Rva2VuLnN0YXJ0X21hcmsuaW5kZXgsIGNfdG9rZW4uc3RhcnRfbWFyay5saW5lLCBjX3Rva2VuLnN0YXJ0X21hcmsuY29sdW1uKQorICAgICAgICAgICAgY19lbmQgPSAoY190b2tlbi5lbmRfbWFyay5pbmRleCwgY190b2tlbi5lbmRfbWFyay5saW5lLCBjX3Rva2VuLmVuZF9tYXJrLmNvbHVtbikKKyAgICAgICAgICAgIGFzc2VydCBweV9zdGFydCA9PSBjX3N0YXJ0LCAocHlfc3RhcnQsIGNfc3RhcnQpCisgICAgICAgICAgICBhc3NlcnQgcHlfZW5kID09IGNfZW5kLCAocHlfZW5kLCBjX2VuZCkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIlBZX1RPS0VOUzoiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChweV90b2tlbnMpCisgICAgICAgICAgICBwcmludCgiQ19UT0tFTlM6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQoY190b2tlbnMpCisKK2RlZiB0ZXN0X2Nfc2Nhbm5lcihkYXRhX2ZpbGVuYW1lLCBjYW5vbmljYWxfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UpOgorICAgIF9jb21wYXJlX3NjYW5uZXJzKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLCB2ZXJib3NlKQorICAgIF9jb21wYXJlX3NjYW5uZXJzKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJykucmVhZCgpLAorICAgICAgICAgICAgb3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksIHZlcmJvc2UpCisgICAgX2NvbXBhcmVfc2Nhbm5lcnMob3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLAorICAgICAgICAgICAgb3BlbihjYW5vbmljYWxfZmlsZW5hbWUsICdyYicpLCB2ZXJib3NlKQorICAgIF9jb21wYXJlX3NjYW5uZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorCit0ZXN0X2Nfc2Nhbm5lci51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmNhbm9uaWNhbCddCit0ZXN0X2Nfc2Nhbm5lci5za2lwID0gWycuc2tpcC1leHQnXQorCitkZWYgX2NvbXBhcmVfcGFyc2VycyhweV9kYXRhLCBjX2RhdGEsIHZlcmJvc2UpOgorICAgIHB5X2V2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShweV9kYXRhLCBMb2FkZXI9eWFtbC5QeUxvYWRlcikpCisgICAgY19ldmVudHMgPSBbXQorICAgIHRyeToKKyAgICAgICAgZm9yIGV2ZW50IGluIHlhbWwucGFyc2UoY19kYXRhLCBMb2FkZXI9eWFtbC5DTG9hZGVyKToKKyAgICAgICAgICAgIGNfZXZlbnRzLmFwcGVuZChldmVudCkKKyAgICAgICAgYXNzZXJ0IGxlbihweV9ldmVudHMpID09IGxlbihjX2V2ZW50cyksIChsZW4ocHlfZXZlbnRzKSwgbGVuKGNfZXZlbnRzKSkKKyAgICAgICAgZm9yIHB5X2V2ZW50LCBjX2V2ZW50IGluIHppcChweV9ldmVudHMsIGNfZXZlbnRzKToKKyAgICAgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gWydfX2NsYXNzX18nLCAnYW5jaG9yJywgJ3RhZycsICdpbXBsaWNpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScsICdleHBsaWNpdCcsICd2ZXJzaW9uJywgJ3RhZ3MnXToKKyAgICAgICAgICAgICAgICBweV92YWx1ZSA9IGdldGF0dHIocHlfZXZlbnQsIGF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBjX3ZhbHVlID0gZ2V0YXR0cihjX2V2ZW50LCBhdHRyaWJ1dGUsIE5vbmUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IHB5X3ZhbHVlID09IGNfdmFsdWUsIChweV9ldmVudCwgY19ldmVudCwgYXR0cmlidXRlKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiUFlfRVZFTlRTOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KHB5X2V2ZW50cykKKyAgICAgICAgICAgIHByaW50KCJDX0VWRU5UUzoiKQorICAgICAgICAgICAgcHByaW50LnBwcmludChjX2V2ZW50cykKKworZGVmIHRlc3RfY19wYXJzZXIoZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oZGF0YV9maWxlbmFtZSwgJ3JiJyksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLCB2ZXJib3NlKQorICAgIF9jb21wYXJlX3BhcnNlcnMob3BlbihkYXRhX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSwKKyAgICAgICAgICAgIG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9wYXJzZXJzKG9wZW4oY2Fub25pY2FsX2ZpbGVuYW1lLCAncmInKS5yZWFkKCksCisgICAgICAgICAgICBvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorCit0ZXN0X2NfcGFyc2VyLnVuaXR0ZXN0ID0gWycuZGF0YScsICcuY2Fub25pY2FsJ10KK3Rlc3RfY19wYXJzZXIuc2tpcCA9IFsnLnNraXAtZXh0J10KKworZGVmIF9jb21wYXJlX2VtaXR0ZXJzKGRhdGEsIHZlcmJvc2UpOgorICAgIGV2ZW50cyA9IGxpc3QoeWFtbC5wYXJzZShkYXRhLCBMb2FkZXI9eWFtbC5QeUxvYWRlcikpCisgICAgY19kYXRhID0geWFtbC5lbWl0KGV2ZW50cywgRHVtcGVyPXlhbWwuQ0R1bXBlcikKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludChjX2RhdGEpCisgICAgcHlfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKGNfZGF0YSwgTG9hZGVyPXlhbWwuUHlMb2FkZXIpKQorICAgIGNfZXZlbnRzID0gbGlzdCh5YW1sLnBhcnNlKGNfZGF0YSwgTG9hZGVyPXlhbWwuQ0xvYWRlcikpCisgICAgdHJ5OgorICAgICAgICBhc3NlcnQgbGVuKGV2ZW50cykgPT0gbGVuKHB5X2V2ZW50cyksIChsZW4oZXZlbnRzKSwgbGVuKHB5X2V2ZW50cykpCisgICAgICAgIGFzc2VydCBsZW4oZXZlbnRzKSA9PSBsZW4oY19ldmVudHMpLCAobGVuKGV2ZW50cyksIGxlbihjX2V2ZW50cykpCisgICAgICAgIGZvciBldmVudCwgcHlfZXZlbnQsIGNfZXZlbnQgaW4gemlwKGV2ZW50cywgcHlfZXZlbnRzLCBjX2V2ZW50cyk6CisgICAgICAgICAgICBmb3IgYXR0cmlidXRlIGluIFsnX19jbGFzc19fJywgJ2FuY2hvcicsICd0YWcnLCAnaW1wbGljaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnLCAnZXhwbGljaXQnLCAndmVyc2lvbicsICd0YWdzJ106CisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKGV2ZW50LCBhdHRyaWJ1dGUsIE5vbmUpCisgICAgICAgICAgICAgICAgcHlfdmFsdWUgPSBnZXRhdHRyKHB5X2V2ZW50LCBhdHRyaWJ1dGUsIE5vbmUpCisgICAgICAgICAgICAgICAgY192YWx1ZSA9IGdldGF0dHIoY19ldmVudCwgYXR0cmlidXRlLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSA9PSAndGFnJyBhbmQgdmFsdWUgaW4gW05vbmUsICchJ10gXAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHB5X3ZhbHVlIGluIFtOb25lLCAnISddIGFuZCBjX3ZhbHVlIGluIFtOb25lLCAnISddOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSA9PSAnZXhwbGljaXQnIGFuZCAocHlfdmFsdWUgb3IgY192YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYXNzZXJ0IHZhbHVlID09IHB5X3ZhbHVlLCAoZXZlbnQsIHB5X2V2ZW50LCBhdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IHZhbHVlID09IGNfdmFsdWUsIChldmVudCwgY19ldmVudCwgYXR0cmlidXRlKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiRVZFTlRTOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KGV2ZW50cykKKyAgICAgICAgICAgIHByaW50KCJQWV9FVkVOVFM6IikKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQocHlfZXZlbnRzKQorICAgICAgICAgICAgcHJpbnQoIkNfRVZFTlRTOiIpCisgICAgICAgICAgICBwcHJpbnQucHByaW50KGNfZXZlbnRzKQorCitkZWYgdGVzdF9jX2VtaXR0ZXIoZGF0YV9maWxlbmFtZSwgY2Fub25pY2FsX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlKToKKyAgICBfY29tcGFyZV9lbWl0dGVycyhvcGVuKGRhdGFfZmlsZW5hbWUsICdyYicpLnJlYWQoKSwgdmVyYm9zZSkKKyAgICBfY29tcGFyZV9lbWl0dGVycyhvcGVuKGNhbm9uaWNhbF9maWxlbmFtZSwgJ3JiJykucmVhZCgpLCB2ZXJib3NlKQorCit0ZXN0X2NfZW1pdHRlci51bml0dGVzdCA9IFsnLmRhdGEnLCAnLmNhbm9uaWNhbCddCit0ZXN0X2NfZW1pdHRlci5za2lwID0gWycuc2tpcC1leHQnXQorCitkZWYgd3JhcF9leHRfZnVuY3Rpb24oZnVuY3Rpb24pOgorICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICBfc2V0X3VwKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuY3Rpb24oKmFyZ3MsICoqa3dkcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF90ZWFyX2Rvd24oKQorICAgIHdyYXBwZXIuX19uYW1lX18gPSAnJXNfZXh0JyAlIGZ1bmN0aW9uLl9fbmFtZV9fCisgICAgd3JhcHBlci51bml0dGVzdCA9IGZ1bmN0aW9uLnVuaXR0ZXN0CisgICAgd3JhcHBlci5za2lwID0gZ2V0YXR0cihmdW5jdGlvbiwgJ3NraXAnLCBbXSkrWycuc2tpcC1leHQnXQorICAgIHJldHVybiB3cmFwcGVyCisKK2RlZiB3cmFwX2V4dChjb2xsZWN0aW9ucyk6CisgICAgZnVuY3Rpb25zID0gW10KKyAgICBpZiBub3QgaXNpbnN0YW5jZShjb2xsZWN0aW9ucywgbGlzdCk6CisgICAgICAgIGNvbGxlY3Rpb25zID0gW2NvbGxlY3Rpb25zXQorICAgIGZvciBjb2xsZWN0aW9uIGluIGNvbGxlY3Rpb25zOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb2xsZWN0aW9uLCBkaWN0KToKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB2YXJzKGNvbGxlY3Rpb24pCisgICAgICAgIGZvciBrZXkgaW4gc29ydGVkKGNvbGxlY3Rpb24pOgorICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR5cGVzLkZ1bmN0aW9uVHlwZSkgYW5kIGhhc2F0dHIodmFsdWUsICd1bml0dGVzdCcpOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5hcHBlbmQod3JhcF9leHRfZnVuY3Rpb24odmFsdWUpKQorICAgIGZvciBmdW5jdGlvbiBpbiBmdW5jdGlvbnM6CisgICAgICAgIGFzc2VydCBmdW5jdGlvbi5fX25hbWVfXyBub3QgaW4gZ2xvYmFscygpCisgICAgICAgIGdsb2JhbHMoKVtmdW5jdGlvbi5fX25hbWVfX10gPSBmdW5jdGlvbgorCitpbXBvcnQgdGVzdF90b2tlbnMsIHRlc3Rfc3RydWN0dXJlLCB0ZXN0X2Vycm9ycywgdGVzdF9yZXNvbHZlciwgdGVzdF9jb25zdHJ1Y3RvciwgICBcCisgICAgICAgIHRlc3RfZW1pdHRlciwgdGVzdF9yZXByZXNlbnRlciwgdGVzdF9yZWN1cnNpdmUsIHRlc3RfaW5wdXRfb3V0cHV0Cit3cmFwX2V4dChbdGVzdF90b2tlbnMsIHRlc3Rfc3RydWN0dXJlLCB0ZXN0X2Vycm9ycywgdGVzdF9yZXNvbHZlciwgdGVzdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgdGVzdF9lbWl0dGVyLCB0ZXN0X3JlcHJlc2VudGVyLCB0ZXN0X3JlY3Vyc2l2ZSwgdGVzdF9pbnB1dF9vdXRwdXRdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0X2FwcGxpYW5jZQorICAgIHRlc3RfYXBwbGlhbmNlLnJ1bihnbG9iYWxzKCkpCisK