VmVyc2lvbiAKLS0tLS0tLS0tLS0tCiAgQWRkZWQgbGlic3NoMl9zZnRwX3JlYWRkaXJfZXgoKSBhbmQgdXBkYXRlZCBMSUJTU0gyX0FQSU5PIHRvCiAgMjAwNzA2MTUxMjAwIChKYW1lcyBIb3VzbGV5KQoKICBDb252ZXJ0ZWQgYWxsIG9mIHRoZSBsaWJzc2gyIGNvZGUgdG8gYmUgYWJsZSB0byB3b3JrIGluIG5vbi1ibG9ja2luZwogIG1vZGUuICBUaGlzIGluY2x1ZGVkIHNvbWUgcHVibGljIEFQSSBjaGFuZ2VzLCBsaXN0ZWQgYmVsb3cgKEphbWVzIEhvdXNsZXkpCiAgICBDaGFuZ2VkIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXM6CiAgICAgaW50IGxpYnNzaDJfc2Vzc2lvbl9mcmVlKCkKICAgICBpbnQgbGlic3NoMl9wdWJsaWNrZXlfc2h1dGRvd24oKQogICAgIHNzaXplX3QgbGlic3NoMl9jaGFubmVsX3JlYWRfZXgoKQogICAgIHNzaXplX3QgbGlic3NoMl9jaGFubmVsX3dyaXRlX2V4KCkKICAKICAgIEFkZGVkIGZ1bmN0aW9uczoKICAgICBsaWJzc2gyX3Nlc3Npb25fbGFzdF9lcnJubygpLCBsaWJzc2gyX2NoYW5uZWxfaGFuZGxlX2V4dGVuZGVkX2RhdGEyKCksCiAgICAgbGlic3NoMl9jaGFubmVsX3dhaXRfY2xvc2VkKCksIGxpYnNzaDJfY2hhbm5lbF93YWl0X2VvZigpLAogICAgIGxpYnNzaDJfc2Vzc2lvbl9zZXRfYmxvY2tpbmcoKQogICAKICAgIFJlbW92ZWQgZnVuY3Rpb25zOgogICAgIGxpYnNzaDJfY2hhbm5lbF9yZWFkbmJfZXgoKSwgbGlic3NoMl9jaGFubmVsX3dyaXRlbmJfZXgoKSwKICAgICBsaWJzc2gyX3NmdHBfcmVhZG5iKCksIGxpYnNzaDJfc2Z0cF93cml0ZW5iKCksCiAgICAgbGlic3NoMl9zZnRwX21rZGlybmJfZXgoKQoKICBBZGRlZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBmb3Igbm9uLWJsb2NraW5nIG9wZXJhdGlvbnM6IChEYW5pZWwgU3RlbmJlcmcpCiAgIGxpYnNzaDJfY2hhbm5lbF9yZWFkbmJfZXgoKQogICBsaWJzc2gyX2NoYW5uZWxfd3JpdGVuYl9leCgpCiAgIGxpYnNzaDJfc2Z0cF9yZWFkbmIoKQogICBsaWJzc2gyX3NmdHBfd3JpdGVuYigpCgogIFNpemUgcGFyYW1ldGVyIGNoYW5nZWQgZnJvbSAnaW50JyB0byAndW5zaWduZWQgaW50JyBpbiBzZXZlcmFsCiAgcHVibGljIEFQSXMuCgogIEFkZGVkIChhIGZldykgbWFuIHBhZ2VzIGluIGRvY3MvLiAoRGFuaWVsIFN0ZW5iZXJnKQoKICBNYXhpbXVtIFNTSCBwYWNrZXQgc2l6ZSBpcyBub3cgc29tZSAzNTAwMCBieXRlcy4KCiAgUHJpdmF0ZSBpbmNsdWRlIGZpbGVzIGFyZSBub3cgaW4gc3JjLyBhbmQgb25seSBwdWJsaWMgaGVhZGVycyBhcmUgaW4KICBpbmNsdWRlLy4gIChEYW5pZWwgU3RlbmJlcmcpCgogIEF1dG9tYWtlIGFuZCBsaWJ0b29sIGFyZSBiZWluZyB1c2VkIChpbmNyZWFzZWQgcG9ydGFiaWxpdHkpLiAoRGFuaWVsCiAgU3RlbmJlcmcpCgogIEZpeGVkIE9wZW5TU0wgZGV0ZWN0aW9uIHVzaW5nIHBrZy1jb25maWcuIChEYW5pZWwgU3RlbmJlcmcpCgogIFNpbXBsZSBzZWxmIHRlc3QgYWRkZWQgdG8gdGVzdHMvLiAoU2ltb24gSm9zZWZzc29uKQoKICBMaWJnY3J5cHQgY2FuIG5vdyBiZSB1c2VkIGluc3RlYWQgb2YgT3BlblNTTCBpZiB5b3Ugc3BlY2lmeQogIC0td2l0aC1saWJnY3J5cHQuICAoU2ltb24gSm9zZWZzc29uKQoKICBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBwYWNrZXQgaGFuZGxpbmcsIGFuZCBiZXR0ZXIgaGFuZGxlIG91dCBvZgogIG1lbW9yeSBzaXR1YXRpb25zLiAoRGFuIEZhbmRyaWNoKQoKICBNYWRlIGxpYnNzaDIgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42LiAoRGFuIEZhbmRyaWNoKQoKICBJbXByb3ZlZCBwb3J0YWJpbGl0eSB0byBTb2xhcmlzIHJlbGF0ZWQgdG8gLWxzb2NrZXQgYW5kCiAgLWxuc2wuIChTaW1vbiBKb3NlZnNzb24pCgogIENsZWFuIHVwIG9mIFJFQURNRSwgSU5TVEFMTCwgTkVXUywgYWRkZWQgQ2hhbmdlTG9nLiAoU2ltb24KICBKb3NlZnNzb24pCgogIEltcHJvdmUgZGVidWdnaW5nIGNvZGUuICBBdm9pZHMgbWFueSAjaWZkZWYncy4KCiAgSW1wcm92ZWQgc2Vzc2lvbiBjbG9zaW5nIHRvIGF2b2lkIHBvdGVudGlhbGx5IHRydW5jYXRlZCBmaWxlcyBvbgogIE9wZW5TU0ggc2VydmVycyAoRGFuIEZhbmRyaWNoKQoKICBNYWRlIHNvbWUgZnVuY3Rpb24gcGFyYW1ldGVycyBpbiB0aGUgQVBJIGNvbnN0IChEYW4gRmFuZHJpY2gpCgpWZXJzaW9uIDAuMTQKLS0tLS0tLS0tLS0tCgogIFBsdWcgbGVha3MgaW4gRVZQIGNpcGhlciBpbml0L3NodXRkb3duLiAoU2VsY3VrIEd1ZW5leSkKCiAgQWxsb3cgc29ja2V0X2ZkID09IDAgaW4gbGlic3NoMl9zZXNzaW9uX3N0YXJ0dXAoKS4gKHB1dWRlbGkpCgogIFN3YXAgb3JkZXJpbmcgb2YgcGFja2V0X2FkZC9wYWNrZXQtaW5zcGVjdGlvbiB0byBhdm9pZCBpbnNwZWN0IGFmdGVyIGZyZWUuIChTZWxjdWspCgogIFN3YXAgS0VYX0lOSVQgb3JkZXJpbmcsIHNlbmQgb3VyIEtFWF9JTklUIGZpcnN0LgoKICBBZGQgY2hlY2sgZm9yIG9wb3J0dW5pc3RpYyBLRVhfSU5JVCBwYWNrZXRzLiAgQnVybiBiYWQgZ3Vlc3MgaWYgbmVjZXNzYXJ5LgoKICBGaXggT3BlblNTTCBkZXRlY3Rpb24gdXNpbmcgcGtnLWNvbmZpZy4gKERhbiBDYXNleSkKClZlcnNpb24gMC4xMwotLS0tLS0tLS0tLS0KCiAgRml4ZWQgY2hhbm5lbCBub3QgYmVpbmcgbWFya2VkIGNsb3NlZCB3aGVuIENIQU5ORUxfQ0xPU0UgcGFja2FnZSBjYW5ub3QgYmUgc2VudC4gKERhdmlkIFJvYmlucykKCiAgRml4ZWQgcGF5bG9hZCBwYWNrZXQgYWxsb2NhdGlvbiBidWcgd2hlbiBpbnZhbGlkIHBhY2tldCBsZW5ndGggcmVjZWl2ZWQuIChEYXZpZCBSb2JpbnMpCgogIEZpeGVkIGBtYWtlIGluc3RhbGwnIHRhcmdldCBmb3IgTWFjT1NYLgoKICBBZGQgdGVybWluYXRpbmcgTlVMTCBjaGFyYWN0ZXIgdG8gcmVhZGxpbmsoKS9yZWFscGF0aCgpIHJlc3VsdHMuCgogIEJ1Z0ZpeCMxNDM2NTkzOiBBcHBseSBidWlsZCBvcHRpb25zIGZvciBIUFVYIHRhcmdldHMuCgpWZXJzaW9uIDAuMTIKLS0tLS0tLS0tLS0tCgogIEFkZGVkIHN1cHBvcnQgZm9yIHB1YmxpY2tleSBzdWJzeXRlbSAobm90IHRoZSBzYW1lIGFzIHB1YmxpY2tleSBhdXRoKS4KCiAgRml4IHgxMV9yZXEuICBNdWx0aXBsZSBwYWNrZXRfbGVuIGlzc3VlcyBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMuCiAgICAoVGhhbmtzIFNpbW9uIEhhcnQpCgogIEZpeCBnZW5lcmF0aW9uIG9mICdlJyBwb3J0aW9uIG9mIERpZmZpZS1IZWxsbWFuIGtleXNldC4KCVVzZSBhcHByb3ByaWF0ZSBvcmRlciBmb3IgQk5fcmFuZCgpIHJhdGhlciB0aGFuIGZpeGVkIGdyb3VwMS1zcGVjaWZpYyB2YWx1ZS4KCiAgUmUtZml4ZWQgbGlic3NoMl9zZnRwX3JlbmFtZV9leCgpCiAgICBUcmFuc3BvcnQgaGFkIHJpZ2h0IHBhY2tldF9sZW4sIGJ1dCBzZnRwIGxheWVyIHN0aWxsIGhhZCBleHRyYSA0IGJ5dGVzLgoKICBGaXhlZCBidWlsZCB3aXRoIG5ld2VyIE9wZW5TU0wgaGVhZGVycy4KCiAgQWRkZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgdG8gbGlic3NoMl9zZnRwLmggZm9yIEMrKyBjb21wYXRhYmlsaXR5LgoKVmVyc2lvbiAwLjExCi0tLS0tLS0tLS0tLQoKICBBZGRlZCBsaWJzc2gyX2Nobm5hbGVfZ2V0X2V4aXRfc3RhdHVzKCkgLS0gTWlraGFpbAoKICBBZGRlZCBsaWJzc2gyX2NoYW5uZWxfd2FpdF9jbG9zZWQoKSAtLSBNaWtoYWlsCgogIEFkZGVkIGxpYnNzaDJfdXNlcmF1dGhfa2V5Ym9hcmRfaW50ZXJhY3RpdmVfZXgoKSAtLSBNaWtoYWlsCgogIEFkZGVkIGxpYnNzaDJfY2hhbm5lbF9yZWNlaXZlX3dpbmRvd19hZGp1c3QoKSB0byBiZSBhYmxlIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIHdpbmRvdy4KCiAgQWRkZWQgcXVldWVpbmcgZm9yIHNtYWxsIHdpbmRvd19hZGp1c3QgcGFja2V0cyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBwYWNrZXQgY29udmVyc2F0aW9uLgoKICBGaXhlZCBsaWJzc2gyX3NmdHBfcmVuYW1lX2V4KCkgdG8gb25seSBzZW5kIGZsYWdzIHBhcmFtZXRlciBpZiB2ZXJzaW9uID49IDUgbmVnb3RpYXRlZAoJKG5vdCBjdXJyZW50bHkgcG9zc2libGUsIGJ1dCB3aWxsIGJlIGFuZCBtaWdodCBhcyB3ZWxsIGtlZXAgdGhlIEFQSSBjb25zaXN0ZW50KS4KClZlcnNpb24gMC4xMAotLS0tLS0tLS0tLS0KCiAgQWRkZWQgZGV2ZWxvcGVyIGRlYnVnZ2luZyBob29rcy4gIFNlZSAtLWVuYWJsZS1kZWJ1Zy0qIG9wdGlvbnMgdG8gLi9jb25maWd1cmUKCiAgSWdub3JlIGV4dGVuZGVkIGRhdGEgaW4gdGhlIFNGVFAgbGF5ZXIuICBXaXRoIG5vIG90aGVyIG1lY2hhbmlzbSB0byBkZWFsIHdpdGggdGhhdCBkYXRhIGl0J2QganVzdCBmaWxsIHVwIGFuZCBnZXQgc3R1Y2suCgogIChSZSlGaXhlZCBjaGFubmVsX3dyaXRlKCkgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSBmb3Igd2luZG93IHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgYWdhaW4uCgogIChSZSlGaXhlZCBTRlRQIElOSVQgdG8gc2VuZCB0aGUgY29ycmVjdCBTRlRQIHBhY2tldCBsZW5ndGguCgogIEZpeGVkIHNlZ2ZhdWx0IHdoZW4gY2xpZW50IGFuZCBob3N0IGNhbid0IGFncmVlIG9uIGEgaG9zdGtleS9jcnlwdC9tYWMvY29tcCBtZXRob2QuIChUaGFua3MgcHV1ZGVsaSkKCiAgRml4ZWQgbWFqb3IgaXNzdWUgd2l0aCBzZnRwIHBhY2tldCBidWZmZXJpbmcgbWVjaGFuaXNtLiAgVXNpbmcgd3JvbmcgYmxvY2tpbmcgc2VtYW50aWNzLiAoTm8gcHV1ZGVsaSwgWU9VIHRoZSBtYW4pCgogIFJlZHVjZWQgYnVzeS1sb29waW5nIG9mIGxpYnNzaDJfc2Z0cF9wYWNrZXRfcmVxdWlyZXYuCgpWZXJzaW9uIDAuOQotLS0tLS0tLS0tLQoKICBDaGFuZ2VkIGJsb2NraW5nX3JlYWQgdG8gb25seSBibG9jayBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBhbmQgbm90IGFuIGFyYml0cmFyeSBsZW5ndGggb2YgdGltZS4gKFRoYW5rcyBGZWxpeCkKCiAgRml4ZWQgU0ZUUCBJTklUL1ZFUlNJT04gdG8gZXhjbHVkZSByZXF1ZXN0X2lkIGFuZCBzZW5kIGNvcnJlY3QgbWF4aW11bSB2ZXJzaW9uIG51bWJlci4KCiAgRml4ZWQgU0ZUUCB0byBiZSBwcm9wZXJseSBCQyB3aXRoIHZlcnNpb24gMSBhbmQgMiBzZXJ2ZXJzLgoKICBGaXhlZCBsaWJzc2gyX3BvbGwoKSB0byByZWNvZ25pemVkIGNsb3NlZCBzZXNzaW9ucy9jaGFubmVscy4KCiAgRml4ZWQgbGlic3NoMl9jaGFubmVsX3dyaXRlX2V4KCkgdG8gZnVsbHkgYmxvY2sgd2hlbiBzZXQgdG8gYmxvY2tpbmcgbW9kZS4gIFJldHVybiBhY3R1YWwgYnl0ZXMgd3JpdHRlbiBhcyB3ZWxsLiAgKFRoYW5rcyBkZWFkZW0pCgogIEFkZGVkIHRlc3RzIGZvciAtbG0gYW5kIC1sc29ja2V0IGFuZCBhZGQgdGhlbSB3aGVuIG5lY2Vzc2FyeS4KCiAgQWRkZWQgbGlic3NoMl9jaGFubmVsX3dpbmRvd19yZWFkX2V4KCkgYW5kIGxpYnNzaDJfY2hhbm5lbF93aW5kb3dfd3JpdGVfZXgoKQogIGZvciBleGFtaW5pbmcgdGhlIHNzaCB0cmFuc3BvcnQgd2luZG93aW5nIHN0YXRlcy4KClZlcnNpb24gMC44Ci0tLS0tLS0tLS0tCgogIEZpeCBwb3RlbnRpYWwgc2VnZmF1bHQgaW4gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KCiAgRml4IGNvbXBhdGFiaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuU1NMCgogIFN3YXBwZWQgb3JkZXIgb2Ygbm9uZSx6bGliIGNvbXByZXNzaW9uIG1vZGVzIHRvIHByZWZlciBubyBjb21wcmVzc2lvbiBieSBkZWZhdWx0LgoKICBBZGRlZCBzeXMvdWlvLmggZm9yIHBsYXRmb3JtcyAoRkJTRCkgd2hpY2ggbmVlZCBpdCBpbiBvcmRlciB0byBkZWZpbmUgc3RydWN0IGlvdmVjLgoKICBBZGRlZCBsaWJzc2gyX3BvbGwoKSB0byBjaGVjayBzdGF0dXMgb2Ygc29ja2V0cy9jaGFubmVscy9saXN0ZW5lcnMuCgogIFJlbW92ZWQgdW5uZWNlc3NhcnkgaW5jbHVzaW9uIG9mIHN0ZGlvLmggKGhvbGRvdmVyIGZyb20gZGVidWdnaW5nKQoKVmVyc2lvbiAwLjcKLS0tLS0tLS0tLS0KCiAgQWRkZWQgbGlic3NoMl91c2VyYXV0aF9ob3N0YmFzZWRfZnJvbWZpbGVfZXgoKSBmb3IgYXV0aGVudGljYXRpbmcgZnJvbSBob3N0a2V5LgoKICBBZGRlZCBjb25maWd1cmUgcmVjb2duaXRpb24gZm9yIE1hY09TWCAoRGFyd2luKSAoVGhhbmtzIEdhYmUpCgogIEZpeGVkIGV4dGVuZGVkIGRhdGEgaWRlbnRpZmljYXRpb24gaW4gbGlic3NoMl9jaGFubmVsX3JlYWQoKS4KCiAgRml4ZWQgd2luZG93IGFkanVzdCBjb2RlLiAgSGFkbid0IGFja25vd2xlZGdlZCBhZGp1c3RtZW50cyBjb3JyZWN0bHkuCgogIFJlbW92ZWQgaW5pdGlhbF93aW5kb3dfc2l6ZSByZXF1aXJlbWVudCBmb3Igc2VuZGluZyB3aW5kb3cgYWRqdXN0IHBhY2tldC4KCgpWZXJzaW9uIDAuNgotLS0tLS0tLS0tLQoKICBBZGRlZCBMSUJTU0gyX0ZMQUdfU0lHUElQRSB0byBlbmFibGUvZGlzYWJsZSBTSUdQSVBFIGdlbmVyYXRlZCBieSBzZW5kKCkvcmVjdigpIGNhbGxzLiBEZWZhdWx0IG9mZi4KCiAgQWRkZWQgbGlic3NoMl9zZXNzaW9uX2ZsYWcoKSB0byBzZXQgb3B0aW9uYWwgc2Vzc2lvbiBmbGFncy4KCiAgQ29sbGFwc2VkIGV4Y2hhbmdpbmdfa2V5cy9uZXdrZXlzL2F1dGhlbnRpY2F0ZWQgZmxhZ3MgaW50byBzaW5nbGUgc3RhdGUgYXR0cmlidXRlLgoKICBGaXggemxpYiBjb21wcmVzc2lvbiBpc3N1ZSB3aGVuIGludGVybmFsIGJ1ZmZlciBzdGF0ZSBtaXNzZXMgcGFydGlhbCBzeW5jLgoKICBGaXggc2VnZmF1bHQgd2hlbiBsaWJzc2gyX3Nlc3Npb25fbWV0aG9kcygpIGlzIGNhbGxlZCBwcmlvciB0byBzZXNzaW9uX3N0YXJ0dXAoKS4KCiAgRml4ZWQgY2xpZW50IHRvIHNlcnZlciBjaGFubmVsIHdpbmRvd2luZy4gIFBlcnZlbnQgc2VuZCBxdWV1ZSBvdmVycnVucy4KCiAgU3dhcHBlZCBiYW5uZXIgc2VuZC9yZWNlaXZlIG9yZGVyIChzZW5kIGZpcnN0LCB0aGVuIHdhaXQgZm9yIHJlc3BvbnNlKS4KClZlcnNpb24gMC41Ci0tLS0tLS0tLS0tCgogICoqKiBCQyBCcmVhayAqKioKICBSZWltcGxlbWVudGVkIGxpYnNzaDJfc2Vzc2lvbl9tZXRob2RzKCkgdG8gbWF0Y2ggbGlic3NoMl9zZXNzaW9uX21ldGhvZF9wcmVmKCkgc3R5bGUKCiAgRml4ZWQgbGlic3NoMl9hdHRyMmJpbigpIChlZmZlY3RzIGFueSBzZXRzdGF0IHN0eWxlIGNhbGwpLgoKICBGaXhlZCBhdXRoZW50aWNhdGluZyB3aXRoIGVuY3J5cHRlZCBwcml2YXRlIGtleS4KCiAgRml4ZWQgYXV0aGVudGljYXRpbmcgdmlhIHNzaC1kc3MgcHVibGljIGtleS4KCiAgRml4ZWQgS0VYX0lOSVQgY29va2llIGFuZCBwYWNrZXQgcGFkZGluZyB0byB1c2UgYWN0dWFsIHJhbmRvbSBkYXRhCgogIEFkZGVkIERFU1RESVIgc3VwcG9ydCB0byBtYWtlZmlsZXMgKEFkYW0gR2+z6mJpb3dza2kgLS0gSSBob3BlIHRoYXQgY2hhcmFjdGVyIHNldCB0cmFuc2xhdGVzIHJpZ2h0KQoKICBBZGRlZCBsaWJzc2gyX2NoYW5uZWxfZm9yd2FyZF9saXN0ZW5fZXgoKSwgbGlic3NoMl9jaGFubmVsX2ZvcndhcmRfY2FuY2VsKCksIGFuZCBsaWJzc2gyX2NoYW5uZWxfZm9yd2FyZF9hY2NlcHQoKS4KCiAgQWRkZWQgLi9jb25maWd1cmUgb3B0aW9uICctLWRpc2FibGUtZ2V4LW5ldycgdG8gYWxsb3cgdXNpbmcgdGhlIG9sZGVyIGdyb3VwLWV4Y2hhbmdlIGZvcm1hdAoKICBBZGRlZCBNQUMgbWV0aG9kcyBobWFjLW1kNSBhbmQgaG1hYy1tZDUtOTYuCgpWZXJzaW9uIDAuNAotLS0tLS0tLS0tLQoKICBGaXhlZCBjcmFzaCB3aGVuIHRyeWluZyB0byBmcmVlIHNmdHBfZGlyaGFuZGxlIGRhdGEgZnJvbSBhIGZpbGVoYW5kbGUgc3RydWN0LgoKICBGaXhlZCBsZWFrIGluIHNmdHBfb3Blbl9leCgpLCBoYW5kbGUtPmhhbmRsZSBub3QgZnJlZWQgaW4gaGFuZGxlX2Nsb3NlKCkuCgogIEZpeGVkIGxlYWsgaW4gc2Z0cF9zeW1saW5rX2V4KCksIHJlc3VsdCBmb3IgUkVBRExJTksgYW5kIFJFQUxQQVRIIG5vdCBmcmVlZCB1bmxlc3MgdGhlcmUgd2FzIGFuIGVycm9yLgoKICBBZGRlZCBsaWJzc2gyX2Jhbm5lcl9zZXQoKSwgc3BlY2lmeSBhbiBhcmJpdHJhcnkgYmFubmVyIHRvIHNlbmQgb24gaW50cm9kdWN0aW9uLgoKVmVyc2lvbiAwLjMKLS0tLS0tLS0tLS0KCiAgRml4ZWQgbGlic3NoMl9jaGFubmVsX3JlYWRfZXgoKS4gIFBhY2tldCBsb29wIGluaXRpYWxpemVkIEJFRk9SRSB0cmFuc3BvcnQgcG9sbGVkIGZvciBuZXcgcGFja2V0cyAoc2hvdWxkIGhhdmUgYmVlbiBhZnRlcikuCgogIEZpeGVkIGJsb2NraW5nIGlzc3VlcyBpbiBzY3Bfc2VuZCgpL3NjcF9yZWN2KCkuCgogIEZpeGVkIGRlZ3JlZSBvZiBpbmRpcmVjdGlvbiBpbiBtYWNlcnJvciBjYWxsYmFjay4KCiAgQ2hhbmdlZCBwYWNrZXQgcmVhZCBtZWNoYW5pc20gdG8gdXNlIGEgZml4ZWQgYnVmZmVyIGFuZCBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvYy9mcmVlIGNhbGxzLiAoZXNwZWNpYWxseSB3aGlsZSBub24tYmxvY2sgbG9vcGluZykKCiAgQWRkZWQgY2hhbm5lbCBjbG9zZSBjYWxsYmFjay4KCiAgQWRkZWQgU0ZUUCBzdXBwb3J0IChVc2luZyBpdHMgb3duIGhlYWRlciBmaWxlOiBsaWJzc2gyX3NmdHAuaCkKClZlcnNpb24gMC4yCi0tLS0tLS0tLS0tCgogIENoYW5nZWQgZXh0ZW5kZWQgZGF0YSBpZ25vcmFuY2UgbWVjaGFuaXNtOgogICAgbGlic3NoMl9jaGFubmVsX2lnbm9yZV9leHRlbmRlZF9kYXRhKCkgY2hhbmdlZCB0byBsaWJzc2gyX2NoYW5uZWxfaGFuZGxlX2V4dGVuZGVkX2RhdGEoKQogICAgTWFjcm8gaW50cm9kdWNlZCBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBkdXJpbmcgYmV0YSBwaGFzZS4KICAgICoqKiBUSEUgTElCU1NIMl9DSEFOTkVMX0lHTk9SRV9FWFRFTkRFRF9EQVRBKCkgTUFDUk8gV0lMTCBCRSBSRU1PVkVEIFBSSU9SIFRPIDEuMCBSRUxFQVNFICoqKgogICAgbGlic3NoMl9jaGFubmVsX2hhbmRsZV9leHRlbmRlZF9kYXRhKCkgbWF5IGJlIHBhc3NlZCBvbmUgb2YgdGhyZWUgImlnbm9yZV9tb2RlIiBjb25zdGFudHMKICAgICAgTElCU1NIMl9DSEFOTkVMX0VYVEVOREVEX0RBVEFfTk9ORSAgICAgICBEZWZhdWx0IGJlaGF2aW9yLCBxdWV1ZSBFRCBwYWNrZXRzIGFuZCByZXR1cm4gdGhlbSB3aXRoIHJlYWRfZXgKICAgICAgTElCU1NIMl9DSEFOTkVMX0VYVEVOREVEX0RBVEFfSUdOT1JFICAgICBFcXVpdmFsZW50IHRvIGxpYnNzaDJfY2hhbm5lbF9pZ25vcmVfZXh0ZW5kZWRfZGF0YSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFIHdpbGwgaW1wbGljaXRseSBmbHVzaCB0aGUgZXh0ZW5kZWQgZGF0YSBzdHJlYW0ocykKICAgICAgTElCU1NIMl9DSEFOTkVMX0VYVEVOREVEX0RBVEFfTUVSR0UgICAgICBDYWxscyB0byBjaGFubmVsX3JlYWQoKSB3aWxsIGNoZWNrIGJvdGggdGhlIHN0YW5kYXJkIGRhdGEgc3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBleHRlbmRlZCBkYXRhIHN0cmVhbShzKSBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWNrZXQKCiAgQ2hhbmdlZCBsaWJzc2gyX3Nlc3Npb25fZGlzY29ubmVjdF9leCgpIHRvIHJldHVybiBhbiBlcnJvciBjb2RlIHdoZW4gYWxsb2MgZmFpbHMKCiAgQWRkZWQgbGlic3NoMl9jaGFubmVsX2ZsdXNoX2V4KCkgYW5kIGJhc2ljIG1hY3JvczogLi4uX2ZsdXNoKCkgLi4uX2ZsdXNoX3N0ZGVycigpCiAgICBmbHVzaF9leCBhY2NlcHRzIGVpdGhlciB0aGUgc3RyZWFtaWQgKDAgZm9yIHN0YW5kYXJkIGRhdGEsIDEgZm9yIHN0ZGVycikgb3Igb25lIG9mIHRoZSB0d28gZm9sbG93aW5nIGNvbnN0YW50czoKICAgICAgTElCU1NIMl9DSEFOTkVMX0ZMVVNIX0FMTCAgICAgICAgICAgICAgICBGbHVzaCBhbGwgc3RyZWFtcwogICAgICBMSUJTU0gyX0NIQU5ORUxfRkxVU0hfRVhURU5ERURfREFUQSAgICAgIEZsdXNoIGFsbCBzdHJlYW1zIEVYQ0VQVCB0aGUgc3RhbmRhcmQgZGF0YSBzdHJlYW0KCiAgQWRkZWQgbGlic3NoMl9zZXNzaW9uX2NhbGxiYWNrX3NldCgpIGZvciBzZXR0aW5nIGlnbm9yZS9kZWJ1Zy9kaXNjb25uZWN0L21hY2Vycm9yIGNhbGxiYWNrcwoKICBBZGRlZCBsaWJzc2gyX3Nlc3Npb25fbWV0aG9kX3ByZWYoKSB0byBzZWxlY3RpdmVseSBzZXQgbWV0aG9kcyBhbmQgbWV0aG9kIHByZWZlcmVuY2VzLgoKICBBZGRlZCBsaWJzc2gyX3Nlc3Npb25fbWV0aG9kcygpIHRvIGRldGVybWluZSB3aGF0IG1ldGhvZHMgd2VyZSBuZWdvdGlhdGVkLgoKICBBZGRlZCBsaWJzc2gyX3Nlc3Npb25fYWJzdHJhY3QoKSBmb3IgcmV0cmVpdmluZyAmc2Vzc2lvbi0+YWJzdHJhY3QKCiAgQWRkZWQgbGlic3NoMl9zZXNzaW9uX2xhc3RfZXJyb3IoKSBmb3IgcmV0cmVpdmluZyBlcnJvciBjb2Rlcy9tZXNzYWdlcwoKVmVyc2lvbiAwLjEKLS0tLS0tLS0tLS0KCiAgSW5pdGlhbCBSZWxlYXNlOgogICAgS0VYIG1ldGhvZHM6IGRpZmZpZS1oZWxsbWFuLWdyb3VwMTQtc2hhMSwgZGlmZmllLWhlbGxtYW4tZ3JvdXAtZXhjaGFuZ2Utc2hhMSwgZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEKICAgIEhvc3RrZXkgbWV0aG9kczogc3NoLXJzYSwgc3NoLWRzcwogICAgQ2lwaGVyIG1ldGhvZHM6IGFlczI1Ni1jYmMsIHJpam5kYWVsLWNiY0BseXNhdG9yLmxpdS5zZSwgYWVzMTkyLWNiYywgYWVzMTI4LWNiYywgYmxvd2Zpc2gtY2JjLCBhcmNmb3VyLCBjYXN0MTI4LWNiYywgM2Rlcy1jYmMsIG5vbmUqCiAgICBDb21wcmVzc2lvbiBtZXRob2RzOiB6bGliLCBub25lCiAgICBNQUMgbWV0aG9kczogaG1hYy1zaGExLCBobWFjLXNoYTEtOTYsIGhtYWMtcmlwZW1kMTYwLCBobWFjLXJpcGVtZDE2MEBvcGVuc3NoLmNvbSBub25lKgogICAgKkNpcGhlci9NQUMgIm5vbmUiIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yIHNlY3VyaXR5IHB1cnBvc2VzLAogICAgIFVzZSAtLWVuYWJsZS1jcnlwdC1ub25lIGFuZC9vciAtLWVuYWJsZS1tYWMtbm9uZSB3aXRoIC4vY29uZmlndXJlIHRvIGVuYWJsZQo=