PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFB5dGhvbiBVbmljb2RlIEludGVncmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3Bvc2FsIFZlcnNpb246IDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkludHJvZHVjdGlvbjoKLS0tLS0tLS0tLS0tLQoKVGhlIGlkZWEgb2YgdGhpcyBwcm9wb3NhbCBpcyB0byBhZGQgbmF0aXZlIFVuaWNvZGUgMy4wIHN1cHBvcnQgdG8KUHl0aG9uIGluIGEgd2F5IHRoYXQgbWFrZXMgdXNlIG9mIFVuaWNvZGUgc3RyaW5ncyBhcyBzaW1wbGUgYXMKcG9zc2libGUgd2l0aG91dCBpbnRyb2R1Y2luZyB0b28gbWFueSBwaXRmYWxscyBhbG9uZyB0aGUgd2F5LgoKU2luY2UgdGhpcyBnb2FsIGlzIG5vdCBlYXN5IHRvIGFjaGlldmUgLS0gc3RyaW5ncyBiZWluZyBvbmUgb2YgdGhlCm1vc3QgZnVuZGFtZW50YWwgb2JqZWN0cyBpbiBQeXRob24gLS0sIHdlIGV4cGVjdCB0aGlzIHByb3Bvc2FsIHRvCnVuZGVyZ28gc29tZSBzaWduaWZpY2FudCByZWZpbmVtZW50cy4KCk5vdGUgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgcHJvcG9zYWwgaXMgc3RpbGwgYSBiaXQgdW5zb3J0ZWQKZHVlIHRvIHRoZSBtYW55IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSBVbmljb2RlLVB5dGhvbiBpbnRlZ3JhdGlvbi4KClRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGFsd2F5cyBhdmFpbGFibGUgYXQ6CgogICAgICAgIGh0dHA6Ly9zdGFyc2hpcC5za3lwb3J0Lm5ldC9+bGVtYnVyZy91bmljb2RlLXByb3Bvc2FsLnR4dAoKT2xkZXIgdmVyc2lvbnMgYXJlIGF2YWlsYWJsZSBhczoKCiAgICAgICAgaHR0cDovL3N0YXJzaGlwLnNreXBvcnQubmV0L35sZW1idXJnL3VuaWNvZGUtcHJvcG9zYWwtWC5YLnR4dAoKCkNvbnZlbnRpb25zOgotLS0tLS0tLS0tLS0KCrcgSW4gZXhhbXBsZXMgd2UgdXNlIHUgPSBVbmljb2RlIG9iamVjdCBhbmQgcyA9IFB5dGhvbiBzdHJpbmcKCrcgJ1hYWCcgbWFya2luZ3MgaW5kaWNhdGUgcG9pbnRzIG9mIGRpc2N1c3Npb24gKFBPRHMpCgoKR2VuZXJhbCBSZW1hcmtzOgotLS0tLS0tLS0tLS0tLS0tCgq3IFVuaWNvZGUgZW5jb2RpbmcgbmFtZXMgc2hvdWxkIGJlIGxvd2VyIGNhc2Ugb24gb3V0cHV0IGFuZAogIGNhc2UtaW5zZW5zaXRpdmUgb24gaW5wdXQgKHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQogIGJ5IGFsbCBBUElzIHRha2luZyBhbiBlbmNvZGluZyBuYW1lIGFzIGlucHV0KS4KCiAgRW5jb2RpbmcgbmFtZXMgc2hvdWxkIGZvbGxvdyB0aGUgbmFtZSBjb252ZW50aW9ucyBhcyB1c2VkIGJ5IHRoZQogIFVuaWNvZGUgQ29uc29ydGl1bTogc3BhY2VzIGFyZSBjb252ZXJ0ZWQgdG8gaHlwaGVucywgZS5nLiAndXRmIDE2JyBpcwogIHdyaXR0ZW4gYXMgJ3V0Zi0xNicuCgogIENvZGVjIG1vZHVsZXMgc2hvdWxkIHVzZSB0aGUgc2FtZSBuYW1lcywgYnV0IHdpdGggaHlwaGVucyBjb252ZXJ0ZWQKICB0byB1bmRlcnNjb3JlcywgZS5nLiB1dGZfOCwgdXRmXzE2LCBpc29fODg1OV8xLgoKtyBUaGUgPGRlZmF1bHQgZW5jb2Rpbmc+IHNob3VsZCBiZSB0aGUgd2lkZWx5IHVzZWQgJ3V0Zi04JyBmb3JtYXQuIFRoaXMKICBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzdGFuZGFyZCA3LWJpdCBBU0NJSSBmb3JtYXQgYW5kIHRodXMgcmVzZW1ibGVzIHRoZQogIHN0YW5kYXJkIHVzZWQgcHJvZ3JhbW1pbmcgbm93YWRheXMgaW4gbW9zdCBhc3BlY3RzLgoKClVuaWNvZGUgQ29uc3RydWN0b3JzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KClB5dGhvbiBzaG91bGQgcHJvdmlkZSBhIGJ1aWx0LWluIGNvbnN0cnVjdG9yIGZvciBVbmljb2RlIHN0cmluZ3Mgd2hpY2gKaXMgYXZhaWxhYmxlIHRocm91Z2ggX19idWlsdGluc19fOgoKICB1ID0gdW5pY29kZShlbmNvZGVkX3N0cmluZ1ssZW5jb2Rpbmc9PGRlZmF1bHQgZW5jb2Rpbmc+XVssZXJyb3JzPSJzdHJpY3QiXSkKCiAgdSA9IHUnPHVuaWNvZGUtZXNjYXBlIGVuY29kZWQgUHl0aG9uIHN0cmluZz4nCgogIHUgPSB1cic8cmF3LXVuaWNvZGUtZXNjYXBlIGVuY29kZWQgUHl0aG9uIHN0cmluZz4nCgpXaXRoIHRoZSAndW5pY29kZS1lc2NhcGUnIGVuY29kaW5nIGJlaW5nIGRlZmluZWQgYXM6Cgq3IGFsbCBub24tZXNjYXBlIGNoYXJhY3RlcnMgcmVwcmVzZW50IHRoZW1zZWx2ZXMgYXMgVW5pY29kZSBvcmRpbmFsCiAgKGUuZy4gJ2EnIC0+IFUrMDA2MSkuCgq3IGFsbCBleGlzdGluZyBkZWZpbmVkIFB5dGhvbiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBhcwogIFVuaWNvZGUgb3JkaW5hbHM7IG5vdGUgdGhhdCBceFhYWFggY2FuIHJlcHJlc2VudCBhbGwgVW5pY29kZQogIG9yZGluYWxzLCBhbmQgXE9PTyAob2N0YWwpIGNhbiByZXByZXNlbnQgVW5pY29kZSBvcmRpbmFscyB1cCB0byBVKzAxRkYuCgq3IGEgbmV3IGVzY2FwZSBzZXF1ZW5jZSwgXHVYWFhYLCByZXByZXNlbnRzIFUrWFhYWDsgaXQgaXMgYSBzeW50YXgKICBlcnJvciB0byBoYXZlIGZld2VyIHRoYW4gNCBkaWdpdHMgYWZ0ZXIgXHUuCgpGb3IgYW4gZXhwbGFuYXRpb24gb2YgcG9zc2libGUgdmFsdWVzIGZvciBlcnJvcnMgc2VlIHRoZSBDb2RlYyBzZWN0aW9uCmJlbG93LgoKRXhhbXBsZXM6Cgp1J2FiYycgICAgICAgICAgLT4gVSswMDYxIFUrMDA2MiBVKzAwNjMKdSdcdTEyMzQnICAgICAgIC0+IFUrMTIzNAp1J2FiY1x1MTIzNFxuJyAgLT4gVSswMDYxIFUrMDA2MiBVKzAwNjMgVSsxMjM0IFUrMDA1YwoKVGhlICdyYXctdW5pY29kZS1lc2NhcGUnIGVuY29kaW5nIGlzIGRlZmluZWQgYXMgZm9sbG93czoKCrcgXHVYWFhYIHNlcXVlbmNlIHJlcHJlc2VudCB0aGUgVStYWFhYIFVuaWNvZGUgY2hhcmFjdGVyIGlmIGFuZAogIG9ubHkgaWYgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJhY2tzbGFzaGVzIGlzIG9kZAoKtyBhbGwgb3RoZXIgY2hhcmFjdGVycyByZXByZXNlbnQgdGhlbXNlbHZlcyBhcyBVbmljb2RlIG9yZGluYWwKICAoZS5nLiAnYicgLT4gVSswMDYyKQoKCk5vdGUgdGhhdCB5b3Ugc2hvdWxkIHByb3ZpZGUgc29tZSBoaW50IHRvIHRoZSBlbmNvZGluZyB5b3UgdXNlZCB0bwp3cml0ZSB5b3VyIHByb2dyYW1zIGFzIHByYWdtYSBsaW5lIGluIG9uZSB0aGUgZmlyc3QgZmV3IGNvbW1lbnQgbGluZXMKb2YgdGhlIHNvdXJjZSBmaWxlIChlLmcuICcjIHNvdXJjZSBmaWxlIGVuY29kaW5nOiBsYXRpbi0xJykuIElmIHlvdQpvbmx5IHVzZSA3LWJpdCBBU0NJSSB0aGVuIGV2ZXJ5dGhpbmcgaXMgZmluZSBhbmQgbm8gc3VjaCBub3RpY2UgaXMKbmVlZGVkLCBidXQgaWYgeW91IGluY2x1ZGUgTGF0aW4tMSBjaGFyYWN0ZXJzIG5vdCBkZWZpbmVkIGluIEFTQ0lJLCBpdAptYXkgd2VsbCBiZSB3b3J0aHdoaWxlIGluY2x1ZGluZyBhIGhpbnQgc2luY2UgcGVvcGxlIGluIG90aGVyCmNvdW50cmllcyB3aWxsIHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIHlvdSBzb3VyY2Ugc3RyaW5ncyB0b28uCgoKVW5pY29kZSBUeXBlIE9iamVjdDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClVuaWNvZGUgb2JqZWN0cyBzaG91bGQgaGF2ZSB0aGUgdHlwZSBVbmljb2RlVHlwZSB3aXRoIHR5cGUgbmFtZQondW5pY29kZScsIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHN0YW5kYXJkIHR5cGVzIG1vZHVsZS4KCgpVbmljb2RlIE91dHB1dDoKLS0tLS0tLS0tLS0tLS0tCgpVbmljb2RlIG9iamVjdHMgaGF2ZSBhIG1ldGhvZCAuZW5jb2RlKFtlbmNvZGluZz08ZGVmYXVsdCBlbmNvZGluZz5dKQp3aGljaCByZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBlbmNvZGluZyB0aGUgVW5pY29kZSBzdHJpbmcgdXNpbmcgdGhlCmdpdmVuIHNjaGVtZSAoc2VlIENvZGVjcykuCgogIHByaW50IHUgOj0gcHJpbnQgdS5lbmNvZGUoKSAgICMgdXNpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPgogCiAgc3RyKHUpICA6PSB1LmVuY29kZSgpICAgICAgICAgIyB1c2luZyB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+CgogIHJlcHIodSkgOj0gInUlcyIgJSByZXByKHUuZW5jb2RlKCd1bmljb2RlLWVzY2FwZScpKQoKQWxzbyBzZWUgSW50ZXJuYWwgQXJndW1lbnQgUGFyc2luZyBhbmQgQnVmZmVyIEludGVyZmFjZSBmb3IgZGV0YWlscyBvbgpob3cgb3RoZXIgQVBJcyB3cml0dGVuIGluIEMgd2lsbCB0cmVhdCBVbmljb2RlIG9iamVjdHMuCgoKVW5pY29kZSBPcmRpbmFsczoKLS0tLS0tLS0tLS0tLS0tLS0KClNpbmNlIFVuaWNvZGUgMy4wIGhhcyBhIDMyLWJpdCBvcmRpbmFsIGNoYXJhY3RlciBzZXQsIHRoZSBpbXBsZW1lbnRhdGlvbgpzaG91bGQgcHJvdmlkZSAzMi1iaXQgYXdhcmUgb3JkaW5hbCBjb252ZXJzaW9uIEFQSXM6CgogIG9yZCh1WzoxXSkgKHRoaXMgaXMgdGhlIHN0YW5kYXJkIG9yZCgpIGV4dGVuZGVkIHRvIHdvcmsgd2l0aCBVbmljb2RlCiAgICAgICAgICAgICAgb2JqZWN0cykKICAgICAgICAtLT4gVW5pY29kZSBvcmRpbmFsIG51bWJlciAoMzItYml0KQoKICB1bmljaHIoaSkgCiAgICAgICAgLS0+IFVuaWNvZGUgb2JqZWN0IGZvciBjaGFyYWN0ZXIgaSAocHJvdmlkZWQgaXQgaXMgMzItYml0KTsKICAgICAgICAgICAgVmFsdWVFcnJvciBvdGhlcndpc2UKCkJvdGggQVBJcyBzaG91bGQgZ28gaW50byBfX2J1aWx0aW5zX18ganVzdCBsaWtlIHRoZWlyIHN0cmluZwpjb3VudGVycGFydHMgb3JkKCkgYW5kIGNocigpLgoKTm90ZSB0aGF0IFVuaWNvZGUgcHJvdmlkZXMgc3BhY2UgZm9yIHByaXZhdGUgZW5jb2RpbmdzLiBVc2FnZSBvZiB0aGVzZQpjYW4gY2F1c2UgZGlmZmVyZW50IG91dHB1dCByZXByZXNlbnRhdGlvbnMgb24gZGlmZmVyZW50IG1hY2hpbmVzLiBUaGlzCnByb2JsZW0gaXMgbm90IGEgUHl0aG9uIG9yIFVuaWNvZGUgcHJvYmxlbSwgYnV0IGEgbWFjaGluZSBzZXR1cCBhbmQKbWFpbnRlbmFuY2Ugb25lLgoKCkNvbXBhcmlzb24gJiBIYXNoIFZhbHVlOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClVuaWNvZGUgb2JqZWN0cyBzaG91bGQgY29tcGFyZSBlcXVhbCB0byBvdGhlciBvYmplY3RzIGFmdGVyIHRoZXNlCm90aGVyIG9iamVjdHMgaGF2ZSBiZWVuIGNvZXJjZWQgdG8gVW5pY29kZS4gRm9yIHN0cmluZ3MgdGhpcyBtZWFucwp0aGF0IHRoZXkgYXJlIGludGVycHJldGVkIGFzIFVuaWNvZGUgc3RyaW5nIHVzaW5nIHRoZSA8ZGVmYXVsdAplbmNvZGluZz4uCgpGb3IgdGhlIHNhbWUgcmVhc29uLCBVbmljb2RlIG9iamVjdHMgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBoYXNoIHZhbHVlCmFzIHRoZWlyIFVURi04IGVxdWl2YWxlbnQgc3RyaW5ncy4KCldoZW4gY29tcGFyZWQgdXNpbmcgY21wKCkgKG9yIFB5T2JqZWN0X0NvbXBhcmUoKSkgdGhlIGltcGxlbWVudGF0aW9uCnNob3VsZCBtYXNrIFR5cGVFcnJvcnMgcmFpc2VkIGR1cmluZyB0aGUgY29udmVyc2lvbiB0byByZW1haW4gaW4gc3luY2gKd2l0aCB0aGUgc3RyaW5nIGJlaGF2aW9yLiBBbGwgb3RoZXIgZXJyb3JzIHN1Y2ggYXMgVmFsdWVFcnJvcnMgcmFpc2VkCmR1cmluZyBjb2VyY2lvbiBvZiBzdHJpbmdzIHRvIFVuaWNvZGUgc2hvdWxkIG5vdCBiZSBtYXNrZWQgYW5kIHBhc3NlZAp0aHJvdWdoIHRvIHRoZSB1c2VyLgoKSW4gY29udGFpbm1lbnQgdGVzdHMgKCdhJyBpbiB1J2FiYycgYW5kIHUnYScgaW4gJ2FiYycpIGJvdGggc2lkZXMKc2hvdWxkIGJlIGNvZXJjZWQgdG8gVW5pY29kZSBiZWZvcmUgYXBwbHlpbmcgdGhlIHRlc3QuIEVycm9ycyBvY2N1cmluZwpkdXJpbmcgY29lcmNpb24gKGUuZy4gTm9uZSBpbiB1J2FiYycpIHNob3VsZCBub3QgYmUgbWFza2VkLgoKCkNvZXJjaW9uOgotLS0tLS0tLS0KClVzaW5nIFB5dGhvbiBzdHJpbmdzIGFuZCBVbmljb2RlIG9iamVjdHMgdG8gZm9ybSBuZXcgb2JqZWN0cyBzaG91bGQKYWx3YXlzIGNvZXJjZSB0byB0aGUgbW9yZSBwcmVjaXNlIGZvcm1hdCwgaS5lLiBVbmljb2RlIG9iamVjdHMuCgogIHUgKyBzIDo9IHUgKyB1bmljb2RlKHMpCgogIHMgKyB1IDo9IHVuaWNvZGUocykgKyB1CgpBbGwgc3RyaW5nIG1ldGhvZHMgc2hvdWxkIGRlbGVnYXRlIHRoZSBjYWxsIHRvIGFuIGVxdWl2YWxlbnQgVW5pY29kZQpvYmplY3QgbWV0aG9kIGNhbGwgYnkgY29udmVydGluZyBhbGwgZW52b2x2ZWQgc3RyaW5ncyB0byBVbmljb2RlIGFuZAp0aGVuIGFwcGx5aW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIFVuaWNvZGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUsCmUuZy4KCiAgc3RyaW5nLmpvaW4oKHMsdSksc2VwKSA6PSAocyArIHNlcCkgKyB1CgogIHNlcC5qb2luKChzLHUpKSA6PSAocyArIHNlcCkgKyB1CgpGb3IgYSBkaXNjdXNzaW9uIG9mICUtZm9ybWF0dGluZyB3L3IgdG8gVW5pY29kZSBvYmplY3RzLCBzZWUKRm9ybWF0dGluZyBNYXJrZXJzLgoKCkV4Y2VwdGlvbnM6Ci0tLS0tLS0tLS0tCgpVbmljb2RlRXJyb3IgaXMgZGVmaW5lZCBpbiB0aGUgZXhjZXB0aW9ucyBtb2R1bGUgYXMgc3ViY2xhc3Mgb2YKVmFsdWVFcnJvci4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoZSBDIGxldmVsIHZpYSBQeUV4Y19Vbmljb2RlRXJyb3IuCkFsbCBleGNlcHRpb25zIHJlbGF0ZWQgdG8gVW5pY29kZSBlbmNvZGluZy9kZWNvZGluZyBzaG91bGQgYmUKc3ViY2xhc3NlcyBvZiBVbmljb2RlRXJyb3IuCgoKQ29kZWNzIChDb2Rlci9EZWNvZGVycykgTG9va3VwOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIENvZGVjIChzZWUgQ29kZWMgSW50ZXJmYWNlIERlZmluaXRpb24pIHNlYXJjaCByZWdpc3RyeSBzaG91bGQgYmUKaW1wbGVtZW50ZWQgYnkgYSBtb2R1bGUgImNvZGVjcyI6CgogIGNvZGVjcy5yZWdpc3RlcihzZWFyY2hfZnVuY3Rpb24pCgpTZWFyY2ggZnVuY3Rpb25zIGFyZSBleHBlY3RlZCB0byB0YWtlIG9uZSBhcmd1bWVudCwgdGhlIGVuY29kaW5nIG5hbWUKaW4gYWxsIGxvd2VyIGNhc2UgbGV0dGVycyBhbmQgd2l0aCBoeXBoZW5zIGFuZCBzcGFjZXMgY29udmVydGVkIHRvCnVuZGVyc2NvcmVzLCBhbmQgcmV0dXJuIGEgdHVwbGUgb2YgZnVuY3Rpb25zIChlbmNvZGVyLCBkZWNvZGVyLApzdHJlYW1fcmVhZGVyLCBzdHJlYW1fd3JpdGVyKSB0YWtpbmcgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CgogIGVuY29kZXIgYW5kIGRlY29kZXI6CglUaGVzZSBtdXN0IGJlIGZ1bmN0aW9ucyBvciBtZXRob2RzIHdoaWNoIGhhdmUgdGhlIHNhbWUKCWludGVyZmFjZSBhcyB0aGUgLmVuY29kZS8uZGVjb2RlIG1ldGhvZHMgb2YgQ29kZWMgaW5zdGFuY2VzCgkoc2VlIENvZGVjIEludGVyZmFjZSkuIFRoZSBmdW5jdGlvbnMvbWV0aG9kcyBhcmUgZXhwZWN0ZWQgdG8KCXdvcmsgaW4gYSBzdGF0ZWxlc3MgbW9kZS4KCiAgc3RyZWFtX3JlYWRlciBhbmQgc3RyZWFtX3dyaXRlcjoKCVRoZXNlIG5lZWQgdG8gYmUgZmFjdG9yeSBmdW5jdGlvbnMgd2l0aCB0aGUgZm9sbG93aW5nCglpbnRlcmZhY2U6CgoJICAgICAgICBmYWN0b3J5KHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpCgogICAgICAgIFRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBtdXN0IHJldHVybiBvYmplY3RzIHByb3ZpZGluZwogICAgICAgIHRoZSBpbnRlcmZhY2VzIGRlZmluZWQgYnkgU3RyZWFtV3JpdGVyL1N0cmVhbVJlYWRlciByZXNwLgogICAgICAgIChzZWUgQ29kZWMgSW50ZXJmYWNlKS4gU3RyZWFtIGNvZGVjcyBjYW4gbWFpbnRhaW4gc3RhdGUuCgoJUG9zc2libGUgdmFsdWVzIGZvciBlcnJvcnMgYXJlIGRlZmluZWQgaW4gdGhlIENvZGVjCglzZWN0aW9uIGJlbG93LgoKSW4gY2FzZSBhIHNlYXJjaCBmdW5jdGlvbiBjYW5ub3QgZmluZCBhIGdpdmVuIGVuY29kaW5nLCBpdCBzaG91bGQKcmV0dXJuIE5vbmUuCgpBbGlhc2luZyBzdXBwb3J0IGZvciBlbmNvZGluZ3MgaXMgbGVmdCB0byB0aGUgc2VhcmNoIGZ1bmN0aW9ucwp0byBpbXBsZW1lbnQuCgpUaGUgY29kZWNzIG1vZHVsZSB3aWxsIG1haW50YWluIGFuIGVuY29kaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZQpyZWFzb25zLiBFbmNvZGluZ3MgYXJlIGZpcnN0IGxvb2tlZCB1cCBpbiB0aGUgY2FjaGUuIElmIG5vdCBmb3VuZCwgdGhlCmxpc3Qgb2YgcmVnaXN0ZXJlZCBzZWFyY2ggZnVuY3Rpb25zIGlzIHNjYW5uZWQuIElmIG5vIGNvZGVjcyB0dXBsZSBpcwpmb3VuZCwgYSBMb29rdXBFcnJvciBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlIGNvZGVjcyB0dXBsZSBpcyBzdG9yZWQKaW4gdGhlIGNhY2hlIGFuZCByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgoKVG8gcXVlcnkgdGhlIENvZGVjIGluc3RhbmNlIHRoZSBmb2xsb3dpbmcgQVBJIHNob3VsZCBiZSB1c2VkOgoKICBjb2RlY3MubG9va3VwKGVuY29kaW5nKQoKVGhpcyB3aWxsIGVpdGhlciByZXR1cm4gdGhlIGZvdW5kIGNvZGVjcyB0dXBsZSBvciByYWlzZSBhIExvb2t1cEVycm9yLgoKClN0YW5kYXJkIENvZGVjczoKLS0tLS0tLS0tLS0tLS0tLQoKU3RhbmRhcmQgY29kZWNzIHNob3VsZCBsaXZlIGluc2lkZSBhbiBlbmNvZGluZ3MvIHBhY2thZ2UgZGlyZWN0b3J5IGluIHRoZQpTdGFuZGFyZCBQeXRob24gQ29kZSBMaWJyYXJ5LiBUaGUgX19pbml0X18ucHkgZmlsZSBvZiB0aGF0IGRpcmVjdG9yeSBzaG91bGQKaW5jbHVkZSBhIENvZGVjIExvb2t1cCBjb21wYXRpYmxlIHNlYXJjaCBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgYSBsYXp5IG1vZHVsZQpiYXNlZCBjb2RlYyBsb29rdXAuCgpQeXRob24gc2hvdWxkIHByb3ZpZGUgYSBmZXcgc3RhbmRhcmQgY29kZWNzIGZvciB0aGUgbW9zdCByZWxldmFudAplbmNvZGluZ3MsIGUuZy4gCgogICd1dGYtOCc6ICAgICAgICAgICAgICA4LWJpdCB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcKICAndXRmLTE2JzogICAgICAgICAgICAgMTYtYml0IHZhcmlhYmxlIGxlbmd0aCBlbmNvZGluZyAobGl0dGUvYmlnIGVuZGlhbikKICAndXRmLTE2LWxlJzogICAgICAgICAgdXRmLTE2IGJ1dCBleHBsaWNpdGx5IGxpdHRsZSBlbmRpYW4KICAndXRmLTE2LWJlJzogICAgICAgICAgdXRmLTE2IGJ1dCBleHBsaWNpdGx5IGJpZyBlbmRpYW4KICAnYXNjaWknOiAgICAgICAgICAgICAgNy1iaXQgQVNDSUkgY29kZXBhZ2UKICAnaXNvLTg4NTktMSc6ICAgICAgICAgSVNPIDg4NTktMSAoTGF0aW4gMSkgY29kZXBhZ2UKICAndW5pY29kZS1lc2NhcGUnOiAgICAgU2VlIFVuaWNvZGUgQ29uc3RydWN0b3JzIGZvciBhIGRlZmluaXRpb24KICAncmF3LXVuaWNvZGUtZXNjYXBlJzogU2VlIFVuaWNvZGUgQ29uc3RydWN0b3JzIGZvciBhIGRlZmluaXRpb24KICAnbmF0aXZlJzogICAgICAgICAgICAgRHVtcCBvZiB0aGUgSW50ZXJuYWwgRm9ybWF0IHVzZWQgYnkgUHl0aG9uCgpDb21tb24gYWxpYXNlcyBzaG91bGQgYWxzbyBiZSBwcm92aWRlZCBwZXIgZGVmYXVsdCwgZS5nLiAgJ2xhdGluLTEnCmZvciAnaXNvLTg4NTktMScuCgpOb3RlOiAndXRmLTE2JyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYW5kIHJlcXVpcmluZyBieXRlIG9yZGVyCm1hcmtzIChCT00pIGZvciBmaWxlIGlucHV0L291dHB1dC4KCkFsbCBvdGhlciBlbmNvZGluZ3Mgc3VjaCBhcyB0aGUgQ0pLIG9uZXMgdG8gc3VwcG9ydCBBc2lhbiBzY3JpcHRzCnNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzZXBlcmF0ZSBwYWNrYWdlcyB3aGljaCBkbyBub3QgZ2V0IGluY2x1ZGVkCmluIHRoZSBjb3JlIFB5dGhvbiBkaXN0cmlidXRpb24gYW5kIGFyZSBub3QgYSBwYXJ0IG9mIHRoaXMgcHJvcG9zYWwuCgoKQ29kZWNzIEludGVyZmFjZSBEZWZpbml0aW9uOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgZm9sbG93aW5nIGJhc2UgY2xhc3Mgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIG1vZHVsZQoiY29kZWNzIi4gVGhleSBwcm92aWRlIG5vdCBvbmx5IHRlbXBsYXRlcyBmb3IgdXNlIGJ5IGVuY29kaW5nIG1vZHVsZQppbXBsZW1lbnRvcnMsIGJ1dCBhbHNvIGRlZmluZSB0aGUgaW50ZXJmYWNlIHdoaWNoIGlzIGV4cGVjdGVkIGJ5IHRoZQpVbmljb2RlIGltcGxlbWVudGF0aW9uLgoKTm90ZSB0aGF0IHRoZSBDb2RlYyBJbnRlcmZhY2UgZGVmaW5lZCBoZXJlIGlzIHdlbGwgc3VpdGFibGUgZm9yIGEKbGFyZ2VyIHJhbmdlIG9mIGFwcGxpY2F0aW9ucy4gVGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gZXhwZWN0cwpVbmljb2RlIG9iamVjdHMgb24gaW5wdXQgZm9yIC5lbmNvZGUoKSBhbmQgLndyaXRlKCkgYW5kIGNoYXJhY3RlcgpidWZmZXIgY29tcGF0aWJsZSBvYmplY3RzIG9uIGlucHV0IGZvciAuZGVjb2RlKCkuIE91dHB1dCBvZiAuZW5jb2RlKCkKYW5kIC5yZWFkKCkgc2hvdWxkIGJlIGEgUHl0aG9uIHN0cmluZyBhbmQgLmRlY29kZSgpIG11c3QgcmV0dXJuIGFuClVuaWNvZGUgb2JqZWN0LgoKRmlyc3QsIHdlIGhhdmUgdGhlIHN0YXRlbGVzcyBlbmNvZGVycy9kZWNvZGVycy4gVGhlc2UgZG8gbm90IHdvcmsgaW4KY2h1bmtzIGFzIHRoZSBzdHJlYW0gY29kZWNzIChzZWUgYmVsb3cpIGRvLCBiZWNhdXNlIGFsbCBjb21wb25lbnRzIGFyZQpleHBlY3RlZCB0byBiZSBhdmFpbGFibGUgaW4gbWVtb3J5LgoKY2xhc3MgQ29kZWM6CgogICAgIiIiIERlZmluZXMgdGhlIGludGVyZmFjZSBmb3Igc3RhdGVsZXNzIGVuY29kZXJzL2RlY29kZXJzLgoKICAgICAgICBUaGUgLmVuY29kZSgpLy5kZWNvZGUoKSBtZXRob2RzIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yCiAgICAgICAgaGFuZGxpbmcgc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIGVycm9ycyBhcmd1bWVudC4gVGhlc2UKICAgICAgICBzdHJpbmcgdmFsdWVzIGFyZSBkZWZpbmVkOgoKICAgICAgICAgJ3N0cmljdCcgLSByYWlzZSBhbiBlcnJvciAob3IgYSBzdWJjbGFzcykKICAgICAgICAgJ2lnbm9yZScgLSBpZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAogICAgICAgICAncmVwbGFjZScgLSByZXBsYWNlIHdpdGggYSBzdWl0YWJsZSByZXBsYWNlbWVudCBjaGFyYWN0ZXI7CiAgICAgICAgICAgICAgICAgICAgUHl0aG9uIHdpbGwgdXNlIHRoZSBvZmZpY2lhbCBVK0ZGRkQgUkVQTEFDRU1FTlQKICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVIgZm9yIHRoZSBidWlsdGluIFVuaWNvZGUgY29kZWNzLgoKICAgICIiIgogICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgCiAgICAgICAgIiIiIEVuY29kZXMgdGhlIG9iamVjdCBpbnRwdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CiAgICAgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KCiAgICAgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KICAgICAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcuCgogICAgICAgICAgICBUaGUgbWV0aG9kIG1heSBub3Qgc3RvcmUgc3RhdGUgaW4gdGhlIENvZGVjIGluc3RhbmNlLiBVc2UKICAgICAgICAgICAgU3RlYW1Db2RlYyBmb3IgY29kZWNzIHdoaWNoIGhhdmUgdG8ga2VlcCBzdGF0ZSBpbiBvcmRlciB0bwogICAgICAgICAgICBtYWtlIGVuY29kaW5nL2RlY29kaW5nIGVmZmljaWVudC4KCiAgICAgICAgIiIiCgkuLi4KCiAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKCiAgICAgICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKICAgICAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgoKICAgICAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKICAgICAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CiAgICAgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgogICAgICAgIAogICAgICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCiAgICAgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nLgoKICAgICAgICAgICAgVGhlIG1ldGhvZCBtYXkgbm90IHN0b3JlIHN0YXRlIGluIHRoZSBDb2RlYyBpbnN0YW5jZS4gVXNlCiAgICAgICAgICAgIFN0ZWFtQ29kZWMgZm9yIGNvZGVjcyB3aGljaCBoYXZlIHRvIGtlZXAgc3RhdGUgaW4gb3JkZXIgdG8KICAgICAgICAgICAgbWFrZSBlbmNvZGluZy9kZWNvZGluZyBlZmZpY2llbnQuCgogICAgICAgICIiIiAKICAgICAgICAuLi4KClN0cmVhbVdyaXRlciBhbmQgU3RyZWFtUmVhZGVyIGRlZmluZSB0aGUgaW50ZXJmYWNlIGZvciBzdGF0ZWZ1bAplbmNvZGVycy9kZWNvZGVycyB3aGljaCB3b3JrIG9uIHN0cmVhbXMuIFRoZXNlIGFsbG93IHByb2Nlc3Npbmcgb2YgdGhlCmRhdGEgaW4gY2h1bmtzIHRvIGVmZmljaWVudGx5IHVzZSBtZW1vcnkuIElmIHlvdSBoYXZlIGxhcmdlIHN0cmluZ3MgaW4KbWVtb3J5LCB5b3UgbWF5IHdhbnQgdG8gd3JhcCB0aGVtIHdpdGggY1N0cmluZ0lPIG9iamVjdHMgYW5kIHRoZW4gdXNlCnRoZXNlIGNvZGVjcyBvbiB0aGVtIHRvIGJlIGFibGUgdG8gZG8gY2h1bmsgcHJvY2Vzc2luZyBhcyB3ZWxsLAplLmcuIHRvIHByb3ZpZGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVdyaXRlciBpbnN0YW5jZS4KCiAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciB3cml0aW5nCiAgICAgICAgICAgIChiaW5hcnkpIGRhdGEuCgogICAgICAgICAgICBUaGUgU3RyZWFtV3JpdGVyIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKCiAgICAgICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGEgVmFsdWVFcnJvciAob3IgYSBzdWJjbGFzcykKICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCgogICAgICAgICIiIgogICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKCiAgICBkZWYgd3JpdGUoc2VsZixvYmplY3QpOgoKICAgICAgICAiIiIgV3JpdGVzIHRoZSBvYmplY3QncyBjb250ZW50cyBlbmNvZGVkIHRvIHNlbGYuc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGRhdGEsIGNvbnN1bWVkID0gc2VsZi5lbmNvZGUob2JqZWN0LHNlbGYuZXJyb3JzKQogICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCiAgICAgICAgCiAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKCiAgICAgICAgIiIiIFdyaXRlcyB0aGUgY29uY2F0ZW5hdGVkIGxpc3Qgb2Ygc3RyaW5ncyB0byB0aGUgc3RyZWFtCiAgICAgICAgICAgIHVzaW5nIC53cml0ZSgpLgogICAgICAgICIiIgogICAgICAgIHNlbGYud3JpdGUoJycuam9pbihsaXN0KSkKICAgICAgICAKICAgIGRlZiByZXNldChzZWxmKToKCiAgICAgICAgIiIiIEZsdXNoZXMgYW5kIHJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgoKICAgICAgICAgICAgQ2FsbGluZyB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGRhdGEgb24gdGhlCiAgICAgICAgICAgIG91dHB1dCBpcyBwdXQgaW50byBhIGNsZWFuIHN0YXRlLCB0aGF0IGFsbG93cyBhcHBlbmRpbmcKICAgICAgICAgICAgb2YgbmV3IGZyZXNoIGRhdGEgd2l0aG91dCBoYXZpbmcgdG8gcmVzY2FuIHRoZSB3aG9sZQogICAgICAgICAgICBzdHJlYW0gdG8gcmVjb3ZlciBzdGF0ZS4KCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLG5hbWUsCgogICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CgogICAgICAgICIiIiBJbmhlcml0IGFsbCBvdGhlciBtZXRob2RzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLG5hbWUpCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVJlYWRlciBpbnN0YW5jZS4KCiAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nCiAgICAgICAgICAgIChiaW5hcnkpIGRhdGEuCgogICAgICAgICAgICBUaGUgU3RyZWFtUmVhZGVyIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKCiAgICAgICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGEgVmFsdWVFcnJvciAob3IgYSBzdWJjbGFzcykKICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOwoKICAgICAgICAiIiIKICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCgogICAgZGVmIHJlYWQoc2VsZixzaXplPS0xKToKCiAgICAgICAgIiIiIERlY29kZXMgZGF0YSBmcm9tIHRoZSBzdHJlYW0gc2VsZi5zdHJlYW0gYW5kIHJldHVybnMgdGhlCiAgICAgICAgICAgIHJlc3VsdGluZyBvYmplY3QuCgogICAgICAgICAgICBzaXplIGluZGljYXRlcyB0aGUgYXBwcm94aW1hdGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8KICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIGRlY29kaW5nIHB1cnBvc2VzLiBUaGUgZGVjb2RlcgogICAgICAgICAgICBjYW4gbW9kaWZ5IHRoaXMgc2V0dGluZyBhcyBhcHByb3ByaWF0ZS4gVGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgLTEgaW5kaWNhdGVzIHRvIHJlYWQgYW5kIGRlY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgc2l6ZQogICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBwcmV2ZW50IGhhdmluZyB0byBkZWNvZGUgaHVnZSBmaWxlcyBpbiBvbmUKICAgICAgICAgICAgc3RlcC4KCiAgICAgICAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSBhIGdyZWVkeSByZWFkIHN0cmF0ZWd5IG1lYW5pbmcgdGhhdAogICAgICAgICAgICBpdCBzaG91bGQgcmVhZCBhcyBtdWNoIGRhdGEgYXMgaXMgYWxsb3dlZCB3aXRoaW4gdGhlCiAgICAgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIGVuY29kaW5nIGFuZCB0aGUgZ2l2ZW4gc2l6ZSwgZS5nLiAgaWYKICAgICAgICAgICAgb3B0aW9uYWwgZW5jb2RpbmcgZW5kaW5ncyBvciBzdGF0ZSBtYXJrZXJzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgb24gdGhlIHN0cmVhbSwgdGhlc2Ugc2hvdWxkIGJlIHJlYWQgdG9vLgoKICAgICAgICAiIiIKICAgICAgICAjIFVuc2xpY2VkIHJlYWRpbmc6CiAgICAgICAgaWYgc2l6ZSA8IDA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZShzZWxmLnN0cmVhbS5yZWFkKCkpWzBdCiAgICAgICAgCiAgICAgICAgIyBTbGljZWQgcmVhZGluZzoKICAgICAgICByZWFkID0gc2VsZi5zdHJlYW0ucmVhZAogICAgICAgIGRlY29kZSA9IHNlbGYuZGVjb2RlCiAgICAgICAgZGF0YSA9IHJlYWQoc2l6ZSkKICAgICAgICBpID0gMAogICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9iamVjdCwgZGVjb2RlZGJ5dGVzID0gZGVjb2RlKGRhdGEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICAgICAgICAgICMgVGhpcyBtZXRob2QgaXMgc2xvdyBidXQgc2hvdWxkIHdvcmsgdW5kZXIgcHJldHR5IG11Y2gKICAgICAgICAgICAgICAgICMgYWxsIGNvbmRpdGlvbnM7IGF0IG1vc3QgMTAgdHJpZXMgYXJlIG1hZGUKICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgbmV3ZGF0YSA9IHJlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhIG9yIGkgPiAxMDoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBuZXdkYXRhCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0CgogICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6CgogICAgICAgICIiIiBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZQogICAgICAgICAgICBkZWNvZGVkIGRhdGEuCgogICAgICAgICAgICBOb3RlOiBVbmxpa2UgdGhlIC5yZWFkbGluZXMoKSBtZXRob2QsIHRoaXMgbWV0aG9kIGluaGVyaXRzCiAgICAgICAgICAgIHRoZSBsaW5lIGJyZWFraW5nIGtub3dsZWRnZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSdzCiAgICAgICAgICAgIC5yZWFkbGluZSgpIG1ldGhvZCAtLSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gc3VwcG9ydCBmb3IKICAgICAgICAgICAgbGluZSBicmVha2luZyB1c2luZyB0aGUgY29kZWMgZGVjb2RlciBkdWUgdG8gbGFjayBvZiBsaW5lCiAgICAgICAgICAgIGJ1ZmZlcmluZy4gU3VibGNhc3NlcyBzaG91bGQgaG93ZXZlciwgaWYgcG9zc2libGUsIHRyeSB0bwogICAgICAgICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdXNpbmcgdGhlaXIgb3duIGtub3dsZWRnZSBvZiBsaW5lCiAgICAgICAgICAgIGJyZWFraW5nLgoKICAgICAgICAgICAgc2l6ZSwgaWYgZ2l2ZW4sIGlzIHBhc3NlZCBhcyBzaXplIGFyZ3VtZW50IHRvIHRoZSBzdHJlYW0ncwogICAgICAgICAgICAucmVhZGxpbmUoKSBtZXRob2QuCiAgICAgICAgICAgIAogICAgICAgICIiIgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgbGluZSA9IHNlbGYuc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5zdHJlYW0ucmVhZGxpbmUoc2l6ZSkKICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUobGluZSlbMF0KCiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PTApOgoKICAgICAgICAiIiIgUmVhZCBhbGwgbGluZXMgYXZhaWxhYmxlIG9uIHRoZSBpbnB1dCBzdHJlYW0KICAgICAgICAgICAgYW5kIHJldHVybiB0aGVtIGFzIGxpc3Qgb2YgbGluZXMuCgogICAgICAgICAgICBMaW5lIGJyZWFrcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGNvZGVjJ3MgZGVjb2RlcgogICAgICAgICAgICBtZXRob2QgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBlbnRyaWVzLgogICAgICAgICAgICAKICAgICAgICAgICAgc2l6ZWhpbnQsIGlmIGdpdmVuLCBpcyBwYXNzZWQgYXMgc2l6ZSBhcmd1bWVudCB0byB0aGUKICAgICAgICAgICAgc3RyZWFtJ3MgLnJlYWQoKSBtZXRob2QuCgogICAgICAgICIiIgogICAgICAgIGlmIHNpemVoaW50IGlzIE5vbmU6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0ucmVhZChzaXplaGludCkKICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUoZGF0YSlbMF0uc3BsaXRsaW5lcygxKQoKICAgIGRlZiByZXNldChzZWxmKToKCiAgICAgICAgIiIiIFJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgoKICAgICAgICAgICAgTm90ZSB0aGF0IG5vIHN0cmVhbSByZXBvc2l0aW9uaW5nIHNob3VsZCB0YWtlIHBsYWNlLgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBwcmltYXJlbHkgaW50ZW5kZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyCiAgICAgICAgICAgIGZyb20gZGVjb2RpbmcgZXJyb3JzLgoKICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSwKCiAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cj1nZXRhdHRyKToKCiAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zdHJlYW0sbmFtZSkKCgpTdHJlYW0gY29kZWMgaW1wbGVtZW50b3JzIGFyZSBmcmVlIHRvIGNvbWJpbmUgdGhlIFN0cmVhbVdyaXRlciBhbmQKU3RyZWFtUmVhZGVyIGludGVyZmFjZXMgaW50byBvbmUgY2xhc3MuIEV2ZW4gY29tYmluaW5nIGFsbCB0aGVzZSB3aXRoCnRoZSBDb2RlYyBjbGFzcyBzaG91bGQgYmUgcG9zc2libGUuCgpJbXBsZW1lbnRvcnMgYXJlIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwgbWV0aG9kcyB0byBlbmhhbmNlIHRoZSBjb2RlYwpmdW5jdGlvbmFsaXR5IG9yIHByb3ZpZGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB0aGVtIHRvCndvcmsuIFRoZSBpbnRlcm5hbCBjb2RlYyBpbXBsZW1lbnRhdGlvbiB3aWxsIG9ubHkgdXNlIHRoZSBhYm92ZQppbnRlcmZhY2VzLCB0aG91Z2guCgpJdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZXNlIGJhc2UKY2xhc3Nlcywgb25seSB0aGUgaW50ZXJmYWNlcyBtdXN0IG1hdGNoOyB0aGlzIGFsbG93cyB3cml0aW5nIENvZGVjcyBhcwpleHRlbnNpb25zIHR5cGVzLgoKQXMgZ3VpZGVsaW5lLCBsYXJnZSBtYXBwaW5nIHRhYmxlcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgc3RhdGljCkMgZGF0YSBpbiBzZXBhcmF0ZSAoc2hhcmVkKSBleHRlbnNpb24gbW9kdWxlcy4gVGhhdCB3YXkgbXVsdGlwbGUKcHJvY2Vzc2VzIGNhbiBzaGFyZSB0aGUgc2FtZSBkYXRhLgoKQSB0b29sIHRvIGF1dG8tY29udmVydCBVbmljb2RlIG1hcHBpbmcgZmlsZXMgdG8gbWFwcGluZyBtb2R1bGVzIHNob3VsZCBiZQpwcm92aWRlZCB0byBzaW1wbGlmeSBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIG1hcHBpbmdzIChzZWUgUmVmZXJlbmNlcykuCgoKV2hpdGVzcGFjZToKLS0tLS0tLS0tLS0KClRoZSAuc3BsaXQoKSBtZXRob2Qgd2lsbCBoYXZlIHRvIGtub3cgYWJvdXQgd2hhdCBpcyBjb25zaWRlcmVkCndoaXRlc3BhY2UgaW4gVW5pY29kZS4KCgpDYXNlIENvbnZlcnNpb246Ci0tLS0tLS0tLS0tLS0tLS0KCkNhc2UgY29udmVyc2lvbiBpcyByYXRoZXIgY29tcGxpY2F0ZWQgd2l0aCBVbmljb2RlIGRhdGEsIHNpbmNlIHRoZXJlCmFyZSBtYW55IGRpZmZlcmVudCBjb25kaXRpb25zIHRvIHJlc3BlY3QuIFNlZQoKICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjEzLyAKCmZvciBzb21lIGd1aWRlbGluZXMgb24gaW1wbGVtZW50aW5nIGNhc2UgY29udmVyc2lvbi4KCkZvciBQeXRob24sIHdlIHNob3VsZCBvbmx5IGltcGxlbWVudCB0aGUgMS0xIGNvbnZlcnNpb25zIGluY2x1ZGVkIGluClVuaWNvZGUuIExvY2FsZSBkZXBlbmRlbnQgYW5kIG90aGVyIHNwZWNpYWwgY2FzZSBjb252ZXJzaW9ucyAoc2VlIHRoZQpVbmljb2RlIHN0YW5kYXJkIGZpbGUgU3BlY2lhbENhc2luZy50eHQpIHNob3VsZCBiZSBsZWZ0IHRvIHVzZXIgbGFuZApyb3V0aW5lcyBhbmQgbm90IGdvIGludG8gdGhlIGNvcmUgaW50ZXJwcmV0ZXIuCgpUaGUgbWV0aG9kcyAuY2FwaXRhbGl6ZSgpIGFuZCAuaXNjYXBpdGFsaXplZCgpIHNob3VsZCBmb2xsb3cgdGhlIGNhc2UKbWFwcGluZyBhbGdvcml0aG0gZGVmaW5lZCBpbiB0aGUgYWJvdmUgdGVjaG5pY2FsIHJlcG9ydCBhcyBjbG9zZWx5IGFzCnBvc3NpYmxlLgoKCkxpbmUgQnJlYWtzOgotLS0tLS0tLS0tLS0KCkxpbmUgYnJlYWtpbmcgc2hvdWxkIGJlIGRvbmUgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgaGF2aW5nIHRoZSBCCnByb3BlcnR5IGFzIHdlbGwgYXMgdGhlIGNvbWJpbmF0aW9ucyBDUkxGLCBDUiwgTEYgKGludGVycHJldGVkIGluIHRoYXQKb3JkZXIpIGFuZCBvdGhlciBzcGVjaWFsIGxpbmUgc2VwYXJhdG9ycyBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZC4KClRoZSBVbmljb2RlIHR5cGUgc2hvdWxkIHByb3ZpZGUgYSAuc3BsaXRsaW5lcygpIG1ldGhvZCB3aGljaCByZXR1cm5zIGEKbGlzdCBvZiBsaW5lcyBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHNwZWNpZmljYXRpb24uIFNlZSBVbmljb2RlCk1ldGhvZHMuCgoKVW5pY29kZSBDaGFyYWN0ZXIgUHJvcGVydGllczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgc2VwYXJhdGUgbW9kdWxlICJ1bmljb2RlZGF0YSIgc2hvdWxkIHByb3ZpZGUgYSBjb21wYWN0IGludGVyZmFjZSB0bwphbGwgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCdzClVuaWNvZGVEYXRhLnR4dCBmaWxlLgoKQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGVzZSBwcm9wZXJ0aWVzIHByb3ZpZGUgd2F5cyB0byByZWNvZ25pemUKbnVtYmVycywgZGlnaXRzLCBzcGFjZXMsIHdoaXRlc3BhY2UsIGV0Yy4KClNpbmNlIHRoaXMgbW9kdWxlIHdpbGwgaGF2ZSB0byBwcm92aWRlIGFjY2VzcyB0byBhbGwgVW5pY29kZQpjaGFyYWN0ZXJzLCBpdCB3aWxsIGV2ZW50dWFsbHkgaGF2ZSB0byBjb250YWluIHRoZSBkYXRhIGZyb20KVW5pY29kZURhdGEudHh0IHdoaWNoIHRha2VzIHVwIGFyb3VuZCA2MDBrQi4gRm9yIHRoaXMgcmVhc29uLCB0aGUgZGF0YQpzaG91bGQgYmUgc3RvcmVkIGluIHN0YXRpYyBDIGRhdGEuIFRoaXMgZW5hYmxlcyBjb21waWxhdGlvbiBhcyBzaGFyZWQKbW9kdWxlIHdoaWNoIHRoZSB1bmRlcmx5aW5nIE9TIGNhbiBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgKHVubGlrZQpub3JtYWwgUHl0aG9uIGNvZGUgbW9kdWxlcykuCgpUaGVyZSBzaG91bGQgYmUgYSBzdGFuZGFyZCBQeXRob24gaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgdGhpcyBpbmZvcm1hdGlvbgpzbyB0aGF0IG90aGVyIGltcGxlbWVudG9ycyBjYW4gcGx1ZyBpbiB0aGVpciBvd24gcG9zc2libHkgZW5oYW5jZWQgdmVyc2lvbnMsCmUuZy4gb25lcyB0aGF0IGRvIGRlY29tcHJlc3Npbmcgb2YgdGhlIGRhdGEgb24tdGhlLWZseS4KCgpQcml2YXRlIENvZGUgUG9pbnQgQXJlYXM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClN1cHBvcnQgZm9yIHRoZXNlIGlzIGxlZnQgdG8gdXNlciBsYW5kIENvZGVjcyBhbmQgbm90IGV4cGxpY2l0bHkKaW50ZXJncmF0ZWQgaW50byB0aGUgY29yZS4gTm90ZSB0aGF0IGR1ZSB0byB0aGUgSW50ZXJuYWwgRm9ybWF0IGJlaW5nCmltcGxlbWVudGVkLCBvbmx5IHRoZSBhcmVhIGJldHdlZW4gXHVFMDAwIGFuZCBcdUY4RkYgaXMgdXNlYWJsZSBmb3IKcHJpdmF0ZSBlbmNvZGluZ3MuCgoKSW50ZXJuYWwgRm9ybWF0OgotLS0tLS0tLS0tLS0tLS0tCgpUaGUgaW50ZXJuYWwgZm9ybWF0IGZvciBVbmljb2RlIG9iamVjdHMgc2hvdWxkIHVzZSBhIFB5dGhvbiBzcGVjaWZpYwpmaXhlZCBmb3JtYXQgPFB5dGhvblVuaWNvZGU+IGltcGxlbWVudGVkIGFzICd1bnNpZ25lZCBzaG9ydCcgKG9yCmFub3RoZXIgdW5zaWduZWQgbnVtZXJpYyB0eXBlIGhhdmluZyAxNiBiaXRzKS4gQnl0ZSBvcmRlciBpcyBwbGF0Zm9ybQpkZXBlbmRlbnQuCgpUaGlzIGZvcm1hdCB3aWxsIGhvbGQgVVRGLTE2IGVuY29kaW5ncyBvZiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlCm9yZGluYWxzLiBUaGUgUHl0aG9uIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gd2lsbCBhZGRyZXNzIHRoZXNlIHZhbHVlcwphcyBpZiB0aGV5IHdlcmUgVUNTLTIgdmFsdWVzLiBVQ1MtMiBhbmQgVVRGLTE2IGFyZSB0aGUgc2FtZSBmb3IgYWxsCmN1cnJlbnRseSBkZWZpbmVkIFVuaWNvZGUgY2hhcmFjdGVyIHBvaW50cy4gVVRGLTE2IHdpdGhvdXQgc3Vycm9nYXRlcwpwcm92aWRlcyBhY2Nlc3MgdG8gYWJvdXQgNjRrIGNoYXJhY3RlcnMgYW5kIGNvdmVycyBhbGwgY2hhcmFjdGVycyBpbgp0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApIG9mIFVuaWNvZGUuCgpJdCBpcyB0aGUgQ29kZWMncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSB0aGV5IHBhc3MgdG8KdGhlIFVuaWNvZGUgb2JqZWN0IGNvbnN0cnVjdG9yIHJlcGVjdHMgdGhpcyBhc3N1bXB0aW9uLiBUaGUKY29uc3RydWN0b3IgZG9lcyBub3QgY2hlY2sgdGhlIGRhdGEgZm9yIFVuaWNvZGUgY29tcGxpYW5jZSBvciB1c2Ugb2YKc3Vycm9nYXRlcy4KCkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGV4dGVuZCB0aGUgMzIgYml0IHJlc3RyaWN0aW9uIHRvIHRoZSBmdWxsCnNldCBvZiBhbGwgVVRGLTE2IGFkZHJlc3NhYmxlIGNoYXJhY3RlcnMgKGFyb3VuZCAxTSBjaGFyYWN0ZXJzKS4KClRoZSBVbmljb2RlIEFQSSBzaG91bGQgcHJvdmlkZSBpbnRlZmFjZSByb3V0aW5lcyBmcm9tIDxQeXRob25Vbmljb2RlPgp0byB0aGUgY29tcGlsZXIncyB3Y2hhcl90IHdoaWNoIGNhbiBiZSAxNiBvciAzMiBiaXQgZGVwZW5kaW5nIG9uIHRoZQpjb21waWxlci9saWJjL3BsYXRmb3JtIGJlaW5nIHVzZWQuCgpVbmljb2RlIG9iamVjdHMgc2hvdWxkIGhhdmUgYSBwb2ludGVyIHRvIGEgY2FjaGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0CjxkZWZlbmNzdHI+IGhvbGRpbmcgdGhlIG9iamVjdCdzIHZhbHVlIHVzaW5nIHRoZSBjdXJyZW50IDxkZWZhdWx0CmVuY29kaW5nPi4gIFRoaXMgaXMgbmVlZGVkIGZvciBwZXJmb3JtYW5jZSBhbmQgaW50ZXJuYWwgcGFyc2luZyAoc2VlCkludGVybmFsIEFyZ3VtZW50IFBhcnNpbmcpIHJlYXNvbnMuIFRoZSBidWZmZXIgaXMgZmlsbGVkIHdoZW4gdGhlCmZpcnN0IGNvbnZlcnNpb24gcmVxdWVzdCB0byB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+IGlzIGlzc3VlZCBvbiB0aGUKb2JqZWN0LgoKSW50ZXJuaW5nIGlzIG5vdCBuZWVkZWQgKGZvciBub3cpLCBzaW5jZSBQeXRob24gaWRlbnRpZmllcnMgYXJlCmRlZmluZWQgYXMgYmVpbmcgQVNDSUkgb25seS4KCmNvZGVjcy5CT00gc2hvdWxkIHJldHVybiB0aGUgYnl0ZSBvcmRlciBtYXJrIChCT00pIGZvciB0aGUgZm9ybWF0CnVzZWQgaW50ZXJuYWxseS4gVGhlIGNvZGVjcyBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdGhlIGZvbGxvd2luZwphZGRpdGlvbmFsIGNvbnN0YW50cyBmb3IgY29udmVuaWVuY2UgYW5kIHJlZmVyZW5jZSAoY29kZWNzLkJPTSB3aWxsCmVpdGhlciBiZSBCT01fQkUgb3IgQk9NX0xFIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0pOgoKICBCT01fQkU6ICdcMzc2XDM3NycgCiAgICAoY29ycmVzcG9uZHMgdG8gVW5pY29kZSBVKzAwMDBGRUZGIGluIFVURi0xNiBvbiBiaWcgZW5kaWFuCiAgICAgcGxhdGZvcm1zID09IFpFUk8gV0lEVEggTk8tQlJFQUsgU1BBQ0UpCgogIEJPTV9MRTogJ1wzNzdcMzc2JyAKICAgIChjb3JyZXNwb25kcyB0byBVbmljb2RlIFUrMDAwMEZGRkUgaW4gVVRGLTE2IG9uIGxpdHRsZSBlbmRpYW4KICAgICBwbGF0Zm9ybXMgPT0gZGVmaW5lZCBhcyBiZWluZyBhbiBpbGxlZ2FsIFVuaWNvZGUgY2hhcmFjdGVyKQoKICBCT000X0JFOiAnXDAwMFwwMDBcMzc2XDM3NycKICAgIChjb3JyZXNwb25kcyB0byBVbmljb2RlIFUrMDAwMEZFRkYgaW4gVUNTLTQpCgogIEJPTTRfTEU6ICdcMzc3XDM3NlwwMDBcMDAwJwogICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkZGRSBpbiBVQ1MtNCkKCk5vdGUgdGhhdCBVbmljb2RlIHNlZXMgYmlnIGVuZGlhbiBieXRlIG9yZGVyIGFzIGJlaW5nICJjb3JyZWN0Ii4gVGhlCnN3YXBwZWQgb3JkZXIgaXMgdGFrZW4gdG8gYmUgYW4gaW5kaWNhdG9yIGZvciBhICJ3cm9uZyIgZm9ybWF0LCBoZW5jZQp0aGUgaWxsZWdhbCBjaGFyYWN0ZXIgZGVmaW5pdGlvbi4KClRoZSBjb25maWd1cmUgc2NyaXB0IHNob3VsZCBwcm92aWRlIGFpZCBpbiBkZWNpZGluZyB3aGV0aGVyIFB5dGhvbiBjYW4KdXNlIHRoZSBuYXRpdmUgd2NoYXJfdCB0eXBlIG9yIG5vdCAoaXQgaGFzIHRvIGJlIGEgMTYtYml0IHVuc2lnbmVkCnR5cGUpLgoKCkJ1ZmZlciBJbnRlcmZhY2U6Ci0tLS0tLS0tLS0tLS0tLS0tCgpJbXBsZW1lbnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UgdXNpbmcgdGhlIDxkZWZlbmNzdHI+IFB5dGhvbiBzdHJpbmcKb2JqZWN0IGFzIGJhc2lzIGZvciBiZl9nZXRjaGFyYnVmIChjb3JyZXNwb25kcyB0byB0aGUgInQjIiBhcmd1bWVudApwYXJzaW5nIG1hcmtlcikgYW5kIHRoZSBpbnRlcm5hbCBidWZmZXIgZm9yIGJmX2dldHJlYWRidWYgKGNvcnJlc3BvbmRzCnRvIHRoZSAicyMiIGFyZ3VtZW50IHBhcnNpbmcgbWFya2VyKS4gSWYgYmZfZ2V0Y2hhcmJ1ZiBpcyByZXF1ZXN0ZWQKYW5kIHRoZSA8ZGVmZW5jc3RyPiBvYmplY3QgZG9lcyBub3QgeWV0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGZpcnN0LgoKVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBiZWluZyBhYmxlIHRvIHdyaXRlIHRvIG91dHB1dCBzdHJlYW1zICh3aGljaAp0eXBpY2FsbHkgdXNlIHRoaXMgaW50ZXJmYWNlKSB3aXRob3V0IGFkZGl0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKZW5jb2RpbmcgdG8gdXNlLgoKVGhlIGludGVybmFsIGZvcm1hdCBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgJ3VuaWNvZGUtaW50ZXJuYWwnCmNvZGVjLCBlLmcuIHZpYSB1LmVuY29kZSgndW5pY29kZS1pbnRlcm5hbCcpLgoKClBpY2tsZS9NYXJzaGFsbGluZzoKLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2hvdWxkIGhhdmUgbmF0aXZlIFVuaWNvZGUgb2JqZWN0IHN1cHBvcnQuIFRoZSBvYmplY3RzIHNob3VsZCBiZQplbmNvZGVkIHVzaW5nIHBsYXRmb3JtIGluZGVwZW5kZW50IGVuY29kaW5ncy4KCk1hcnNoYWwgc2hvdWxkIHVzZSBVVEYtOCBhbmQgUGlja2xlIHNob3VsZCBlaXRoZXIgY2hvb3NlClJhdy1Vbmljb2RlLUVzY2FwZSAoaW4gdGV4dCBtb2RlKSBvciBVVEYtOCAoaW4gYmluYXJ5IG1vZGUpIGFzCmVuY29kaW5nLiBVc2luZyBVVEYtOCBpbnN0ZWFkIG9mIFVURi0xNiBoYXMgdGhlIGFkdmFudGFnZSBvZgplbGltaW5hdGluZyB0aGUgbmVlZCB0byBzdG9yZSBhIEJPTSBtYXJrLgoKClJlZ3VsYXIgRXhwcmVzc2lvbnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTZWNyZXQgTGFicyBBQiBpcyB3b3JraW5nIG9uIGEgVW5pY29kZS1hd2FyZSByZWd1bGFyIGV4cHJlc3Npb24KbWFjaGluZXJ5LiAgSXQgd29ya3Mgb24gcGxhaW4gOC1iaXQsIFVDUy0yLCBhbmQgKG9wdGlvbmFsbHkpIFVDUy00CmludGVybmFsIGNoYXJhY3RlciBidWZmZXJzLgoKQWxzbyBzZWUKCiAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxOC8KCmZvciBzb21lIHJlbWFya3Mgb24gaG93IHRvIHRyZWF0IFVuaWNvZGUgUkVzLgoKCkZvcm1hdHRpbmcgTWFya2VyczoKLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9ybWF0IG1hcmtlcnMgYXJlIHVzZWQgaW4gUHl0aG9uIGZvcm1hdCBzdHJpbmdzLiBJZiBQeXRob24gc3RyaW5ncwphcmUgdXNlZCBhcyBmb3JtYXQgc3RyaW5ncywgdGhlIGZvbGxvd2luZyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGluCmVmZmVjdDoKCiAgJyVzJzogICAgICAgICAgICAgICAgIEZvciBVbmljb2RlIG9iamVjdHMgdGhpcyB3aWxsIGNhdXNlIGNvZXJjaW9uIG9mIHRoZQoJCQl3aG9sZSBmb3JtYXQgc3RyaW5nIHRvIFVuaWNvZGUuIE5vdGUgdGhhdAoJCQl5b3Ugc2hvdWxkIHVzZSBhIFVuaWNvZGUgZm9ybWF0IHN0cmluZyB0byBzdGFydAoJCQl3aXRoIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgoKSW4gY2FzZSB0aGUgZm9ybWF0IHN0cmluZyBpcyBhbiBVbmljb2RlIG9iamVjdCwgYWxsIHBhcmFtZXRlcnMgYXJlIGNvZXJjZWQKdG8gVW5pY29kZSBmaXJzdCBhbmQgdGhlbiBwdXQgdG9nZXRoZXIgYW5kIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdApzdHJpbmcuIE51bWJlcnMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBzdHJpbmdzIGFuZCB0aGVuIHRvIFVuaWNvZGUuCgogICclcyc6CQkJUHl0aG9uIHN0cmluZ3MgYXJlIGludGVycHJldGVkIGFzIFVuaWNvZGUKCQkJc3RyaW5nIHVzaW5nIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4uIFVuaWNvZGUKCQkJb2JqZWN0cyBhcmUgdGFrZW4gYXMgaXMuCgpBbGwgb3RoZXIgc3RyaW5nIGZvcm1hdHRlcnMgc2hvdWxkIHdvcmsgYWNjb3JkaW5nbHkuCgpFeGFtcGxlOgoKdSIlcyAlcyIgJSAodSJhYmMiLCAiYWJjIikgID09ICB1ImFiYyBhYmMiCgoKSW50ZXJuYWwgQXJndW1lbnQgUGFyc2luZzoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXNlIG1hcmtlcnMgYXJlIHVzZWQgYnkgdGhlIFB5QXJnX1BhcnNlVHVwbGUoKSBBUElzOgoKICAiVSI6ICBDaGVjayBmb3IgVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQKCiAgInMiOiAgRm9yIFVuaWNvZGUgb2JqZWN0czogYXV0byBjb252ZXJ0IHRoZW0gdG8gdGhlIDxkZWZhdWx0IGVuY29kaW5nPgogICAgICAgIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBvYmplY3QncyA8ZGVmZW5jc3RyPiBidWZmZXIuCgogICJzIyI6IEFjY2VzcyB0byB0aGUgVW5pY29kZSBvYmplY3QgdmlhIHRoZSBiZl9nZXRyZWFkYnVmIGJ1ZmZlciBpbnRlcmZhY2UgCiAgICAgICAgKHNlZSBCdWZmZXIgSW50ZXJmYWNlKTsgbm90ZSB0aGF0IHRoZSBsZW5ndGggcmVsYXRlcyB0byB0aGUgYnVmZmVyCiAgICAgICAgbGVuZ3RoLCBub3QgdGhlIFVuaWNvZGUgc3RyaW5nIGxlbmd0aCAodGhpcyBtYXkgYmUgZGlmZmVyZW50CiAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBJbnRlcm5hbCBGb3JtYXQpLgoKICAidCMiOiBBY2Nlc3MgdG8gdGhlIFVuaWNvZGUgb2JqZWN0IHZpYSB0aGUgYmZfZ2V0Y2hhcmJ1ZiBidWZmZXIgaW50ZXJmYWNlCiAgICAgICAgKHNlZSBCdWZmZXIgSW50ZXJmYWNlKTsgbm90ZSB0aGF0IHRoZSBsZW5ndGggcmVsYXRlcyB0byB0aGUgYnVmZmVyCiAgICAgICAgbGVuZ3RoLCBub3QgbmVjZXNzYXJpbHkgdG8gdGhlIFVuaWNvZGUgc3RyaW5nIGxlbmd0aCAodGhpcyBtYXkKICAgICAgICBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4pLgoKICAiZXMiOiAKCVRha2VzIHR3byBwYXJhbWV0ZXJzOiBlbmNvZGluZyAoY29uc3QgY2hhciAqKSBhbmQKCWJ1ZmZlciAoY2hhciAqKikuIAoKCVRoZSBpbnB1dCBvYmplY3QgaXMgZmlyc3QgY29lcmNlZCB0byBVbmljb2RlIGluIHRoZSB1c3VhbCB3YXkKCWFuZCB0aGVuIGVuY29kZWQgaW50byBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuCgoJT24gb3V0cHV0LCBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZAoJcmV0dXJuZWQgdGhyb3VnaCAqYnVmZmVyIGFzIE5VTEwtdGVybWluYXRlZCBzdHJpbmcuCglUaGUgZW5jb2RlZCBtYXkgbm90IGNvbnRhaW4gZW1iZWRkZWQgTlVMTCBjaGFyYWN0ZXJzLgoJVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQeU1lbV9GcmVlKCkKCXRvIGZyZWUgdGhlIGFsbG9jYXRlZCAqYnVmZmVyIGFmdGVyIHVzYWdlLgoKICAiZXMjIjoKCVRha2VzIHRocmVlIHBhcmFtZXRlcnM6IGVuY29kaW5nIChjb25zdCBjaGFyICopLAoJYnVmZmVyIChjaGFyICoqKSBhbmQgYnVmZmVyX2xlbiAoaW50ICopLgoJCglUaGUgaW5wdXQgb2JqZWN0IGlzIGZpcnN0IGNvZXJjZWQgdG8gVW5pY29kZSBpbiB0aGUgdXN1YWwgd2F5CglhbmQgdGhlbiBlbmNvZGVkIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLgoKCUlmICpidWZmZXIgaXMgbm9uLU5VTEwsICpidWZmZXJfbGVuIG11c3QgYmUgc2V0IHRvIHNpemVvZihidWZmZXIpCglvbiBpbnB1dC4gT3V0cHV0IGlzIHRoZW4gY29waWVkIHRvICpidWZmZXIuCgoJSWYgKmJ1ZmZlciBpcyBOVUxMLCBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUgaXMKCWFsbG9jYXRlZCBhbmQgb3V0cHV0IGNvcGllZCBpbnRvIGl0LiAqYnVmZmVyIGlzIHRoZW4KCXVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgYXJlYS4KCVRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgUHlNZW1fRnJlZSgpCgl0byBmcmVlIHRoZSBhbGxvY2F0ZWQgKmJ1ZmZlciBhZnRlciB1c2FnZS4KCglJbiBib3RoIGNhc2VzICpidWZmZXJfbGVuIGlzIHVwZGF0ZWQgdG8gdGhlIG51bWJlciBvZgoJY2hhcmFjdGVycyB3cml0dGVuIChleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTEwtYnl0ZSkuCglUaGUgb3V0cHV0IGJ1ZmZlciBpcyBhc3N1cmVkIHRvIGJlIE5VTEwtdGVybWluYXRlZC4KCkV4YW1wbGVzOgoKVXNpbmcgImVzIyIgd2l0aCBhdXRvLWFsbG9jYXRpb246CgogICAgc3RhdGljIFB5T2JqZWN0ICoKICAgIHRlc3RfcGFyc2VyKFB5T2JqZWN0ICpzZWxmLAoJCVB5T2JqZWN0ICphcmdzKQogICAgewoJUHlPYmplY3QgKnN0cjsKCWNvbnN0IGNoYXIgKmVuY29kaW5nID0gImxhdGluLTEiOwoJY2hhciAqYnVmZmVyID0gTlVMTDsKCWludCBidWZmZXJfbGVuID0gMDsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImVzIzp0ZXN0X3BhcnNlciIsCgkJCSAgICAgIGVuY29kaW5nLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCgkgICAgcmV0dXJuIE5VTEw7CglpZiAoIWJ1ZmZlcikgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKCQkJICAgICJidWZmZXIgaXMgTlVMTCIpOwoJICAgIHJldHVybiBOVUxMOwoJfQoJc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBidWZmZXJfbGVuKTsKCVB5TWVtX0ZyZWUoYnVmZmVyKTsKCXJldHVybiBzdHI7CiAgICB9CgpVc2luZyAiZXMiIHdpdGggYXV0by1hbGxvY2F0aW9uIHJldHVybmluZyBhIE5VTEwtdGVybWluYXRlZCBzdHJpbmc6ICAgIAogICAgCiAgICBzdGF0aWMgUHlPYmplY3QgKgogICAgdGVzdF9wYXJzZXIoUHlPYmplY3QgKnNlbGYsCgkJUHlPYmplY3QgKmFyZ3MpCiAgICB7CglQeU9iamVjdCAqc3RyOwoJY29uc3QgY2hhciAqZW5jb2RpbmcgPSAibGF0aW4tMSI7CgljaGFyICpidWZmZXIgPSBOVUxMOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXM6dGVzdF9wYXJzZXIiLAoJCQkgICAgICBlbmNvZGluZywgJmJ1ZmZlcikpCgkgICAgcmV0dXJuIE5VTEw7CglpZiAoIWJ1ZmZlcikgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKCQkJICAgICJidWZmZXIgaXMgTlVMTCIpOwoJICAgIHJldHVybiBOVUxMOwoJfQoJc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwoJUHlNZW1fRnJlZShidWZmZXIpOwoJcmV0dXJuIHN0cjsKICAgIH0KClVzaW5nICJlcyMiIHdpdGggYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcjoKICAgIAogICAgc3RhdGljIFB5T2JqZWN0ICoKICAgIHRlc3RfcGFyc2VyKFB5T2JqZWN0ICpzZWxmLAoJCVB5T2JqZWN0ICphcmdzKQogICAgewoJUHlPYmplY3QgKnN0cjsKCWNvbnN0IGNoYXIgKmVuY29kaW5nID0gImxhdGluLTEiOwoJY2hhciBfYnVmZmVyWzEwXTsKCWNoYXIgKmJ1ZmZlciA9IF9idWZmZXI7CglpbnQgYnVmZmVyX2xlbiA9IHNpemVvZihfYnVmZmVyKTsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImVzIzp0ZXN0X3BhcnNlciIsCgkJCSAgICAgIGVuY29kaW5nLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCgkgICAgcmV0dXJuIE5VTEw7CglpZiAoIWJ1ZmZlcikgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKCQkJICAgICJidWZmZXIgaXMgTlVMTCIpOwoJICAgIHJldHVybiBOVUxMOwoJfQoJc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBidWZmZXJfbGVuKTsKCXJldHVybiBzdHI7CiAgICB9CgoKRmlsZS9TdHJlYW0gT3V0cHV0OgotLS0tLS0tLS0tLS0tLS0tLS0tCgpTaW5jZSBmaWxlLndyaXRlKG9iamVjdCkgYW5kIG1vc3Qgb3RoZXIgc3RyZWFtIHdyaXRlcnMgdXNlIHRoZSAicyMiCmFyZ3VtZW50IHBhcnNpbmcgbWFya2VyIGZvciBiaW5hcnkgZmlsZXMgYW5kICJ0IyIgZm9yIHRleHQgZmlsZXMsIHRoZQpidWZmZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgdGhlIGVuY29kaW5nIHRvIHVzZSAoc2VlCkJ1ZmZlciBJbnRlcmZhY2UpLgoKRm9yIGV4cGxpY2l0IGhhbmRsaW5nIG9mIGZpbGVzIHVzaW5nIFVuaWNvZGUsIHRoZSBzdGFuZGFyZApzdHJlYW0gY29kZWNzIGFzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBjb2RlY3MgbW9kdWxlIHNob3VsZCAKYmUgdXNlZC4KClRoZSBjb2RlY3MgbW9kdWxlIHNob3VsZCBwcm92aWRlIGEgc2hvcnQtY3V0IG9wZW4oZmlsZW5hbWUsbW9kZSxlbmNvZGluZykKYXZhaWxhYmxlIHdoaWNoIGFsc28gYXNzdXJlcyB0aGF0IG1vZGUgY29udGFpbnMgdGhlICdiJyBjaGFyYWN0ZXIgd2hlbgpuZWVkZWQuCgoKRmlsZS9TdHJlYW0gSW5wdXQ6Ci0tLS0tLS0tLS0tLS0tLS0tLQoKT25seSB0aGUgdXNlciBrbm93cyB3aGF0IGVuY29kaW5nIHRoZSBpbnB1dCBkYXRhIHVzZXMsIHNvIG5vIHNwZWNpYWwKbWFnaWMgaXMgYXBwbGllZC4gVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGV4cGxpY2l0bHkgY29udmVydCB0aGUgc3RyaW5nCmRhdGEgdG8gVW5pY29kZSBvYmplY3RzIGFzIG5lZWRlZCBvciB1c2UgdGhlIGZpbGUgd3JhcHBlcnMgZGVmaW5lZCBpbgp0aGUgY29kZWNzIG1vZHVsZSAoc2VlIEZpbGUvU3RyZWFtIE91dHB1dCkuCgoKVW5pY29kZSBNZXRob2RzICYgQXR0cmlidXRlczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFsbCBQeXRob24gc3RyaW5nIG1ldGhvZHMsIHBsdXM6CgogIC5lbmNvZGUoW2VuY29kaW5nPTxkZWZhdWx0IGVuY29kaW5nPl1bLGVycm9ycz0ic3RyaWN0Il0pIAogICAgIC0tPiBzZWUgVW5pY29kZSBPdXRwdXQKCiAgLnNwbGl0bGluZXMoW2luY2x1ZGVfYnJlYWtzPTBdKQogICAgIC0tPiBicmVha3MgdGhlIFVuaWNvZGUgc3RyaW5nIGludG8gYSBsaXN0IG9mIChVbmljb2RlKSBsaW5lczsKICAgICAgICAgcmV0dXJucyB0aGUgbGluZXMgd2l0aCBsaW5lIGJyZWFrcyBpbmNsdWRlZCwgaWYgaW5jbHVkZV9icmVha3MKICAgICAgICAgaXMgdHJ1ZS4gU2VlIExpbmUgQnJlYWtzIGZvciBhIHNwZWNpZmljYXRpb24gb2YgaG93IGxpbmUgYnJlYWtpbmcKICAgICAgICAgaXMgZG9uZS4KCgpDb2RlIEJhc2U6Ci0tLS0tLS0tLS0KCldlIHNob3VsZCB1c2UgRnJlZHJpayBMdW5kaCdzIFVuaWNvZGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIGFzIGJhc2lzLgpJdCBhbHJlYWR5IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgc3RyaW5nIG1ldGhvZHMgbmVlZGVkIGFuZCBwcm92aWRlcyBhCndlbGwgd3JpdHRlbiBjb2RlIGJhc2Ugd2hpY2ggd2UgY2FuIGJ1aWxkIHVwb24uCgpUaGUgb2JqZWN0IHNoYXJpbmcgaW1wbGVtZW50ZWQgaW4gRnJlZHJpaydzIGltcGxlbWVudGF0aW9uIHNob3VsZApiZSBkcm9wcGVkLgoKClRlc3QgQ2FzZXM6Ci0tLS0tLS0tLS0tCgpUZXN0IGNhc2VzIHNob3VsZCBmb2xsb3cgdGhvc2UgaW4gTGliL3Rlc3QvdGVzdF9zdHJpbmcucHkgYW5kIGluY2x1ZGUKYWRkaXRpb25hbCBjaGVja3MgZm9yIHRoZSBDb2RlYyBSZWdpc3RyeSBhbmQgdGhlIFN0YW5kYXJkIENvZGVjcy4KCgpSZWZlcmVuY2VzOgotLS0tLS0tLS0tLQoKVW5pY29kZSBDb25zb3J0aXVtOgogICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvCgpVbmljb2RlIEZBUToKICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvZmFxLwoKVW5pY29kZSAzLjA6CiAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3N0YW5kYXJkL3ZlcnNpb25zL1VuaWNvZGUzLjAuaHRtbAoKVW5pY29kZS1UZWNoUmVwb3J0czoKICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90ZWNocmVwb3J0cy5odG1sCgpVbmljb2RlLU1hcHBpbmdzOgogICAgICAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvCgpJbnRyb2R1Y3Rpb24gdG8gVW5pY29kZSAoYSBsaXR0bGUgb3V0ZGF0ZWQgYnkgc3RpbGwgbmljZSB0byByZWFkKToKICAgICAgICBodHRwOi8vd3d3Lm5hZGEua3RoLnNlL2kxOG4vdWNzL3VuaWNvZGUtaXNvMTA2NDYtb3ZpZXcuaHRtbAoKRm9yIGNvbXBhcmlzb246CglJbnRyb2R1Y2luZyBVbmljb2RlIHRvIEVDTUFTY3JpcHQgLS0KCWh0dHA6Ly93d3ctNC5pYm0uY29tL3NvZnR3YXJlL2RldmVsb3Blci9saWJyYXJ5L2ludGVybmF0aW9uYWxpemF0aW9uLXN1cHBvcnQuaHRtbAoKSUFOQSBDaGFyYWN0ZXIgU2V0IE5hbWVzOgoJZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cwoKRW5jb2RpbmdzOgoKICAgIE92ZXJ2aWV3OgogICAgICAgICAgICBodHRwOi8vY3p5Ym9ycmEuY29tL3V0Zi8KCiAgICBVVEMtMjoKICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy91bmljb2RlL3VjczIuaHRtbAoKICAgIFVURi03OgogICAgICAgICAgICBEZWZpbmVkIGluIFJGQzIxNTIsIGUuZy4KICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy9tbC1kb2NzL3JmYzIxNTIudHh0CgogICAgVVRGLTg6CiAgICAgICAgICAgIERlZmluZWQgaW4gUkZDMjI3OSwgZS5nLgogICAgICAgICAgICBodHRwOi8vaW5mby5pbnRlcm5ldC5pc2kuZWR1L2luLW5vdGVzL3JmYy9maWxlcy9yZmMyMjc5LnR4dAoKICAgIFVURi0xNjoKICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy91bmljb2RlL3dnMm4xMDM1Lmh0bWwKCgpIaXN0b3J5IG9mIHRoaXMgUHJvcG9zYWw6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMS40OiBBZGRlZCBub3RlIGFib3V0IG1peGVkIHR5cGUgY29tcGFyaXNvbnMgYW5kIGNvbnRhaW5zIHRlc3RzLgogICAgIENoYW5nZWQgdHJlYXRpbmcgb2YgVW5pY29kZSBvYmplY3RzIGluIGZvcm1hdCBzdHJpbmdzIChpZiB1c2VkCiAgICAgd2l0aCAnJXMnICUgdSB0aGV5IHdpbGwgbm93IGNhdXNlIHRoZSBmb3JtYXQgc3RyaW5nIHRvIGJlCiAgICAgY29lcmNlZCB0byBVbmljb2RlLCB0aHVzIHByb2R1Y2luZyBhIFVuaWNvZGUgb2JqZWN0IG9uIHJldHVybikuCiAgICAgQWRkZWQgbGluayB0byBJQU5BIGNoYXJzZXQgbmFtZXMgKHRoYW5rcyB0byBMYXJzIE1hcml1cyBHYXJzaG9sKS4KICAgICBBZGRlZCBuZXcgY29kZWMgbWV0aG9kcyAucmVhZGxpbmUoKSwgLnJlYWRsaW5lcygpIGFuZCAud3JpdGVsaW5lcygpLgoxLjM6IEFkZGVkIG5ldyAiZXMiIGFuZCAiZXMjIiBwYXJzZXIgbWFya2VycwoxLjI6IFJlbW92ZWQgUE9EIGFib3V0IGNvZGVjcy5vcGVuKCkKMS4xOiBBZGRlZCBub3RlIGFib3V0IGNvbXBhcmlzb25zIGFuZCBoYXNoIHZhbHVlcy4gQWRkZWQgbm90ZSBhYm91dAogICAgIGNhc2UgbWFwcGluZyBhbGdvcml0aG1zLiBDaGFuZ2VkIHN0cmVhbSBjb2RlY3MgLnJlYWQoKSBhbmQKICAgICAud3JpdGUoKSBtZXRob2QgdG8gbWF0Y2ggdGhlIHN0YW5kYXJkIGZpbGUtbGlrZSBvYmplY3QgbWV0aG9kcwogICAgIChieXRlcyBjb25zdW1lZCBpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZHMpCjEuMDogY2hhbmdlZCBlbmNvZGUgQ29kZWMgbWV0aG9kIHRvIGJlIHN5bW1ldHJpYyB0byB0aGUgZGVjb2RlIG1ldGhvZAogICAgICh0aGV5IGJvdGggcmV0dXJuIChvYmplY3QsIGRhdGEgY29uc3VtZWQpIG5vdyBhbmQgdGh1cyBiZWNvbWUKICAgICBpbnRlcmNoYW5nZWFibGUpOyByZW1vdmVkIF9faW5pdF9fIG1ldGhvZCBvZiBDb2RlYyBjbGFzcyAodGhlCiAgICAgbWV0aG9kcyBhcmUgc3RhdGVsZXNzKSBhbmQgbW92ZWQgdGhlIGVycm9ycyBhcmd1bWVudCBkb3duIHRvIHRoZQogICAgIG1ldGhvZHM7IG1hZGUgdGhlIENvZGVjIGRlc2lnbiBtb3JlIGdlbmVyaWMgdy9yIHRvIHR5cGUgb2YgaW5wdXQKICAgICBhbmQgb3V0cHV0IG9iamVjdHM7IGNoYW5nZWQgU3RyZWFtV3JpdGVyLmZsdXNoIHRvIFN0cmVhbVdyaXRlci5yZXNldAogICAgIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJyaWRpbmcgdGhlIHN0cmVhbSdzIC5mbHVzaCgpIG1ldGhvZDsKICAgICByZW5hbWVkIC5icmVha2xpbmVzKCkgdG8gLnNwbGl0bGluZXMoKTsgcmVuYW1lZCB0aGUgbW9kdWxlIHVuaWNvZGVjCiAgICAgdG8gY29kZWNzOyBtb2RpZmllZCB0aGUgRmlsZSBJL08gc2VjdGlvbiB0byByZWZlciB0byB0aGUgc3RyZWFtIGNvZGVjcy4KMC45OiBjaGFuZ2VkIGVycm9ycyBrZXl3b3JkIGFyZ3VtZW50IGRlZmluaXRpb247IGFkZGVkICdyZXBsYWNlJyBlcnJvcgogICAgIGhhbmRsaW5nOyBjaGFuZ2VkIHRoZSBjb2RlYyBBUElzIHRvIGFjY2VwdCBidWZmZXIgbGlrZSBvYmplY3RzIG9uCiAgICAgaW5wdXQ7IHNvbWUgbWlub3IgdHlwbyBmaXhlczsgYWRkZWQgV2hpdGVzcGFjZSBzZWN0aW9uIGFuZAogICAgIGluY2x1ZGVkIHJlZmVyZW5jZXMgZm9yIFVuaWNvZGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgdGhlIHdoaXRlc3BhY2UKICAgICBhbmQgdGhlIGxpbmUgYnJlYWsgY2hhcmFjdGVyaXN0aWM7IGFkZGVkIG5vdGUgdGhhdCBzZWFyY2ggZnVuY3Rpb25zCiAgICAgY2FuIGV4cGVjdCBsb3dlci1jYXNlIGVuY29kaW5nIG5hbWVzOyBkcm9wcGVkIHNsaWNpbmcgYW5kIG9mZnNldHMKICAgICBpbiB0aGUgY29kZWMgQVBJcwowLjg6IGFkZGVkIGVuY29kaW5ncyBwYWNrYWdlIGFuZCByYXcgdW5pY29kZSBlc2NhcGUgZW5jb2Rpbmc7IHVudGFiaWZpZWQKICAgICB0aGUgcHJvcG9zYWw7IGFkZGVkIG5vdGVzIG9uIFVuaWNvZGUgZm9ybWF0IHN0cmluZ3M7IGFkZGVkCiAgICAgLmJyZWFrbGluZXMoKSBtZXRob2QKMC43OiBhZGRlZCBhIHdob2xlIG5ldyBzZXQgb2YgY29kZWMgQVBJczsgYWRkZWQgYSBkaWZmZXJlbnQgZW5jb2RlcgogICAgIGxvb2t1cCBzY2hlbWU7IGZpeGVkIHNvbWUgbmFtZXMKMC42OiBjaGFuZ2VkICJzIyIgdG8gInQjIjsgY2hhbmdlZCA8ZGVmZW5jYnVmPiB0byA8ZGVmZW5jc3RyPiBob2xkaW5nCiAgICAgYSByZWFsIFB5dGhvbiBzdHJpbmcgb2JqZWN0OyBjaGFuZ2VkIEJ1ZmZlciBJbnRlcmZhY2UgdG8gZGVsZWdhdGUKICAgICByZXF1ZXN0cyB0byA8ZGVmZW5jc3RyPidzIGJ1ZmZlciBpbnRlcmZhY2U7IHJlbW92ZWQgdGhlIGV4cGxpY2l0CiAgICAgcmVmZXJlbmNlIHRvIHRoZSB1bmljb2RlYy5jb2RlY3MgZGljdGlvbmFyeSAodGhlIG1vZHVsZSBjYW4gaW1wbGVtZW50CiAgICAgdGhpcyBpbiB3YXkgZml0IGZvciB0aGUgcHVycG9zZSk7IHJlbW92ZWQgdGhlIHNldHRhYmxlIGRlZmF1bHQKICAgICBlbmNvZGluZzsgbW92ZSBVbmljb2RlRXJyb3IgZnJvbSB1bmljb2RlYyB0byBleGNlcHRpb25zOyAicyMiCiAgICAgbm90IHJldHVybnMgdGhlIGludGVybmFsIGRhdGE7IHBhc3NlZCB0aGUgVUNTLTIvVVRGLTE2IGNoZWNraW5nCiAgICAgZnJvbSB0aGUgVW5pY29kZSBjb25zdHJ1Y3RvciB0byB0aGUgQ29kZWNzCjAuNTogbW92ZWQgc3lzLmJvbSB0byB1bmljb2RlYy5CT007IGFkZGVkIHNlY3Rpb25zIG9uIGNhc2UgbWFwcGluZywKICAgICBwcml2YXRlIHVzZSBlbmNvZGluZ3MgYW5kIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMKMC40OiBhZGRlZCBDb2RlYyBpbnRlcmZhY2UsIG5vdGVzIG9uICUtZm9ybWF0dGluZywgY2hhbmdlZCBzb21lIGVuY29kaW5nCiAgICAgZGV0YWlscywgYWRkZWQgY29tbWVudHMgb24gc3RyZWFtIHdyYXBwZXJzLCBmaXhlZCBzb21lIGRpc2N1c3Npb24KICAgICBwb2ludHMgKG1vc3QgaW1wb3J0YW50OiBJbnRlcm5hbCBGb3JtYXQpLCBjbGFyaWZpZWQgdGhlIAogICAgICd1bmljb2RlLWVzY2FwZScgZW5jb2RpbmcsIGFkZGVkIGVuY29kaW5nIHJlZmVyZW5jZXMKMC4zOiBhZGRlZCByZWZlcmVuY2VzLCBjb21tZW50cyBvbiBjb2RlYyBtb2R1bGVzLCB0aGUgaW50ZXJuYWwgZm9ybWF0LAogICAgIGJmX2dldGNoYXJidWZmZXIgYW5kIHRoZSBSRSBlbmdpbmU7IGFkZGVkICd1bmljb2RlLWVzY2FwZScgZW5jb2RpbmcKICAgICBwcm9wb3NlZCBieSBUaW0gUGV0ZXJzIGFuZCBmaXhlZCByZXByKHUpIGFjY29yZGluZ2x5CjAuMjogaW50ZWdyYXRlZCBHdWlkbydzIHN1Z2dlc3Rpb25zLCBhZGRlZCBzdHJlYW0gY29kZWNzIGFuZCBmaWxlCiAgICAgd3JhcHBpbmcKMC4xOiBmaXJzdCB2ZXJzaW9uCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcsIDE5OTktMjAwMCwgbWFsQGxlbWJ1cmcuY29tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCg==